首页 > 编程语言 >安卓程序开发入门

安卓程序开发入门

时间:2023-08-16 17:22:13浏览次数:48  
标签:入门 void 程序开发 jar public 线程 Override new 安卓

Step1

本步骤主要复习安卓软件开发的基本流程;实验共有四个要求,即编写一个会重启后自启动的位置显示,并具备在子进程中调用住进程UIChange函数功能的,同时能够使用反射方法调用libs库中依赖的jar文件的安卓app。按照实验指导书的要求依次实现上述要求。

1-1后台服务

实现了接收重启命令启动程序、后台更新gps数据、获取前台显示和位置权限等三项核心功能。

思路

  1. 首先编写接收重启广播的代码,即SecretBootReceicer.java文件;通过Toast方法实现调试。
public class SecretBootReceiver extends BroadcastReceiver {
    public SecretBootReceiver(){}
    @Override
    public void onReceive(Context context, Intent intent) {}
  1. 接下来进行主活动页面代码的编写,位置和悬浮显示的权限也在该MainActivity.java文件中申请。

该环节中的``floatingWindow的权限申请方法因为随着安卓系统版本不同,申请方法,颇费了一番周折。并且在技术选型上,也存在系统通知 (Notification) 或者浮动窗口 (FloatingWindow) 来代替 Toast`的问题。最后也是根据就近原则(资料最多原则),选择浮动窗口方案。

另外值得说明的是在实验过程中,申请权限以及注册服务都需要在AndroidManifest.xml文件中进行事先声明,由于缺少这一先验知识,在调试代码的过程中走了一些弯路。当然根据SDK版本判断不同的GPS申请权限方法也是踩了坑之后才发现的。

private ActivityResultLauncher<Intent> floatingWindowLauncher;
startActivityForResult(intent, REQUEST_CODE_FLOATING_WINDOW_PERMISSION);
ActivityCompat.requestPermissions(this,new String[]          {Manifest.permission.ACCESS_FINE_LOCATION},
                    REQUEST_LOCATION);
startService(new Intent(this, SecretService.class));
onRequestPermissionsResult;
onActivityResult;
  1. 最后是获取位置服务并显示的功能,也是本软件的核心逻辑,在SecretService.java文件中。主要包括服务注册函数,后台执行函数,位置获取函数和显示函数。
private Runnable runnable = new Runnable() {
  @Override
  public void run() {
      showLocation();
      handler.postDelayed(this, MIN_TIME_BW_UPDATES);
  }
};
private void getLocation();
private void showLocation();
@Override
public void onLocationChanged(Location location) {}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {}

完成上述的代码逻辑编写之后,根据网络上的提示进行Manifest清单文件的配置就可以完成这个app的1-1后台运行显示位置服务的功能了。

结果

观察是否自启动:无论是adb模拟重启还是重启模拟器均实现了reboot后自启动✅

释放内存是否结束:手动清理内存后,进程被杀死且没有被再次唤醒。✅

image20230628170839681

image20230629202644928

1-2子线程中更新ui

该问题是创建一个子线程进行数据输入输出的处理,同时需要在子线程收到数据后更新住进程的ui。通过在子线程中调用runOnUiThread 方法来实现子线程中更新住线程ui

思路

在app中画出输入输出框,并在MainActivity类中进行按钮行为的绑定。在按钮绑定的行为中,点击后新建一个线程来显示对话框。获取输入框中的内容并据此新建一个对话框,然后利用runOnUiThread在主线程中显示对话框。

mEditText = findViewById(R.id.edit_text);
mButton = findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        final String text = mEditText.getText().toString();

        // 创建一个新的线程来显示对话框
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 在子线程中创建对话框并设置文本内容
                final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setTitle("Content");
                builder.setMessage(text);
                // 在主线程中显示对话框
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        builder.show();
                    }
                });
            }
        }).start();
    }
});

结果

1-3反射调用类

通过反射的方法调用calsses.jar文件中的PoRELab类中的变量和方法。采用jd-gui工具查看给定jar文件中的包名,类名,变量名,方法名及其参数方便调用。

方法

下载安装jd-gui后打开classes.jar仔细观察。

jar -tf Step1_Task3_classes.jar| grep 'class' 
java -jar /Users/aibot/Downloads/jd-gui-osx-1.6.6/JD-GUI.app/Contents/Resources/Java/jd-gui-1.6.6-min.jar

之后进行反射调用。

try {
    Class<?> poRELabClass = Class.forName("com.pore.mylibrary.PoRELab", true, getClassLoader());
    // 创建 PoRELab 类的实例
    Object poRELabInstance = poRELabClass.newInstance();
    // 获取 curStr 字段的值
    Field curStrField = poRELabClass.getDeclaredField("curStr");
    curStrField.setAccessible(true);
    String curStrValue = (String) curStrField.get(poRELabInstance);
    // 调用 privateMethod 方法
    Method privateMethod = poRELabClass.getDeclaredMethod("privateMethod", String.class, String.class);
    privateMethod.setAccessible(true);
    privateMethod.invoke(poRELabInstance,"privateMethod","hello");
    Log.d("MainActivity", "curStrValue = " + curStrValue);
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException |
         NoSuchFieldException | NoSuchMethodException | InvocationTargetException e) {
    e.printStackTrace();
}

结果

得到实验指导书中的结果:

image20230628230349897

1-4签名打包

思路

按照AS集成开发环境中的build,signed-apks,设置key-store和key

key_store和key的密码都是xjtuosv

结果

打包好的apk包含Step中1-1至1-4的全部要求,命名为lab3-1_Step1_tanghangyun.apk

标签:入门,void,程序开发,jar,public,线程,Override,new,安卓
From: https://www.cnblogs.com/aibot/p/17635698.html

相关文章

  • 苹果app开发成本是否比安卓高?
    移动应用程序(APP)已经成为现代生活中不可或缺的一部分,而iOS和Android平台则是两个最主要的app发布平台。在开发一个APP时,成本是一个重要的考虑因素,而在苹果(iOS)和安卓(Android)这两个主要平台之间,是否存在开发成本的差异呢?让我们来深入探讨一下。开发工具和语言:ios开发:苹果的iOS平台使......
  • 紫光展锐T610(虎贲610)_芯片性能介绍_全国产安卓核心板定制
    紫光展锐T610核心板是影像全面升级的8核架构的4G移动平台。采用旗舰级DynamIQ架构设计,基于自主研发的第五代影像引擎Vivimagic解决方案,和高画质显示处理技术,为用户带来精致的高画质体验。展锐T610(虎贲610)安卓核心板基本概述虎贲T610处理器是由紫光展锐研发的一颗基于12nm工艺的4G芯......
  • python编程从入门到实践(第2版)学习笔记(变量,字符串)
    变量变量是一种可以赋给值的标签。每一个变量都指向一个相关联的值,下列代码中message即为变量,指向的值为“HelloPythonworld!”message="HelloPythonworld!"print(message)第二行的print()函数用于打印输出这个message变量所关联的值。且变量的值是可以修改的,p......
  • 高效提升工作效率,亚马逊云科技热门课程带你入门生成式AI
    当前人工智能仍处于飞速发展阶段,作为当下最先进的科学技术之一,相信大家对AIGC关注已久。今天,引用亚马逊云科技最新发布的七项生成式AI新功能来跟大家聊聊近期的热门生成式AI! 有人说,生成式AI将带来充满创造性的新世界;有人说,生成式AI热潮正在掀起一场新的科技革命;有人认为生成式AI将......
  • 安卓环境配置
    好久没搞android,一些基础配置忘得差不多了,这里慢慢回忆补充下。window:AndroidIDE需要FQ。gradle更新失败,一般是代理配置错误。需要修改代理,位置为:gradle/gradle.properties.一般代理不支持HTTPS,屏蔽即可。安装JavaSDK,https://www.oracle.com/cn/java/technologies/......
  • 1.C++入门以及简单顺序结构
    C++入门以及简单顺序结构一.编写一个简单的C++程序#include<iostream>usingnamespacestd;intmain(){ return0;}二.基础语法变量1.变量的概念变量本质上是一个装东西的盒子,并且只能存放一个值。2.变量的定义变量必须先定义,才可以使用inta=5;3.变量......
  • Elasticsearch 保姆级入门篇
    Elasticsearch是一个分布式的、面向生产规模工作负载优化的搜索引擎。Kibana可以将Elasticsearch中的数据转化为直观的图表、图形和仪表盘。这篇文章,您将学习本地安装Elasticsearch和Kibana,以及使用开发工具/JavaSDK创建索引和搜索数据。1本地安装1.1创建网络我......
  • MT6765|MTK6765核心板,联发科Helio P35安卓核心板参数
    MT6765核心板采用基于MT6765八核处理器(4×A532.3GHz+4×A531.8GHz)的4G全网通模块,使用12nmFinFET制程工艺。该处理器内置安卓9.0操作系统,同时MTK6765提供LPDDR3或LPDDR4x内存的弹性选择。与上一代处理器相比,它的功耗降低了20%,性能提升了25%,使得产品开发商能够根据市场需求开发兼......
  • 软件app开发和小程序开发如何选择?
    随着移动互联网的快速发展,企业和个人面临着一个重要的决策:是选择开发传统的移动应用程序(APP),还是选择开发小程序?这两种选择都有各自的优势和适用场景,本文将为您详细探讨软件app开发和小程序开发,帮助您做出明智的选择。软件app开发:移动应用程序(APP)一直是企业和个人向用户提供丰富功能......
  • nlp入门(五)隐马尔科夫模型
    源码请到:自然语言处理练习:学习自然语言处理时候写的一些代码(gitee.com)一、马尔科夫模型概念1.1马尔科夫模型:具有马尔可夫性质并以随机过程为基础的模型1.2马尔科夫性质:过去状态只能影响现在状态,影响不了将来的状态1.3马尔科夫过程:随机过程满足马尔科夫性质,状态转移矩......