安卓萌新小愈伤来报道啦!
文章目录
一、安卓项目基本框架
使用XML标记描绘应用界面,使用Java代码书写程序逻辑。
想要观察APP的运行效果,有两种方法:
- 在模拟器上运行APP应用
- 使用真实手机调试App
PC和真机或者模拟器上的Android OS怎么联系起来的,通过adb(Android debug bridges)进行调试通信
在实际开发中,90%的情况是用模拟器,在模拟器上可以做不同版本的兼容性测试。
App 开发主要有两大技术路线,分别是原生开发和混合开发。
混合开发会借助前端、flutter、网页技术等。劣势是渲染性能没有原生开发好,好处是可以跨平台,版本更新不需要重新下载API文件
二、Android 工程目录结构
每个项目至少有一个模块,也能拥有多个模块,一般编译运行APP指的是运行某个模块,而非运行某个项目。
项目级别的build.gradle指定了当前项目的总体编译规则。
模块级别的build.gradle对应于具体模块,每个模块都有自己的build.gradle,它指定了当前模块的详细编译规则。
Gradle是一个项目自动化构建工具,帮我们做了依赖、打包、部署、发布、各种渠道的差异管理工作。
三、日志级别
四、创建新的APP页面(Activity活动)
- 在layout目录下创建XML文件,这个是布局文件,默认会生成一个id,存储在资源R中。在该文件中加入按钮,文本等标签,每个标签都有id,自己命名。
- 创建与XML文件对应的Java代码,一般命名为XXXActivity.class,一定会继承Activity类或者Activity的子类。重写onCreate方法,在onCreate方法中首先获取对应的XML文件的id,就可以使用这个文件中的控件了,在使用控件之前需要获取控件的id。
- 在AndroidMainfest.xml中注册页面配置
在XML中引用一个id,就使用@id/id_name,在XML中定义一个id,则要使用@+id/id_name
五、活动之间的跳转
显示响应跳转
1、在Intent的构造函数中,传递两个参数,一个参数表示跳转的来源页面 XXX.this;第二个参数表示待跳转的页面,即YYY.class.
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
2、调用intent对象的setClass方法指定
Intent intent = new Intent();
intent.setClass(this,ActNextActivity.class);
3、调用intent对象的setComponent方法指定
Intent intent = new Intent();
ComponentName component = new ComponentName(this,ActNextActivity.class);
intent.setComponent(component);
隐式响应跳转
没有明确指定要跳转的目标活动,只给出一个动作字符串让系统自动匹配,属于模糊匹配。
常见的系统动作取值说明:
用setData和addCategory方法指定具体的信息。每一个Intent中只能指定一个action,但能指定多个category
- 打开AndroidMainifest.xml,通过在标签下配置的内容,可以指定当前活动能够响应的action和category。如:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
在action标签中指明了能够响应com.example.activitytest.ACTION_START这个action,并且能够响应的intent中可能带有category
- 修改FirstActivity中的点击事件,在intent的构造函数中将action的字符串传入进去,表明我们想要启动能够响应com.example.activitytest.ACTION_START这个action的活动。这个category:android.intent.category.DEFAULT是一种默认的category,在调用startActivity方法的时候会自动将这个category添加到Intent中。
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Intent intent = new Intent("com.example.activitytest.ACTION_START");
startActivity(intent);
}
});
只有he 标签中的内容能够同时匹配上Intent中指定的action和category时,这个活动才能响应该intent。如果不是用默认的category,则在启动活动中使用intent.addCategory
(“标签中的内容”);
六、数据传递
1、向下一个活动传递数据
putExtra方法将想要传递的数据暂存在intent中,putExtra(键,数据);
button1.setOnClickListener(v -> {
String data = "hello secondActivity";
setContentView(R.layout.second_layout);
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);
});
在下一个活动中将传递的数据取出来,调用intent的getStringExtra方法,传入相应的键值,就可以得到相应的数据了。如果传递的是整数型数据,则使用getIntExtra方法。
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
assert data != null;
Log.d("SecondActivity",data);
2、返回数据给上一个活动
活动中接收启动活动返回的数据:
ActivityResultLauncher<Intent> register = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult o) {
Intent intentData = o.getData();
// 接收活动的返回值
String response = intentData.getStringExtra("response");
tv_send.setText(response);
}
});
//新建一个ActivityResultLauncher对象,以这种方式启动活动可以收到活动的返回值,
findViewById(R.id.button_1).setOnClickListener(v -> {
Intent intent = new Intent(ActSendActivity.this,ActReceiveActivity.class);
intent.putExtra("name",tv_send.getText().toString());
register.launch(intent);
});
销毁启动活动并返回数据
button2.setOnClickListener(v -> {
Intent intent1 = new Intent();
intent1.putExtra("data_return","hello FirstActivity!");
// setResult()方法专门向上一个活动中返回数据,
// 参数1:处理结果,OK或者CANCELED 参数2:带有数据的intent
setResult(RESULT_OK,intent1);
finish();
});
七、Avtivity生命周期
onSaveInstanceState方法保证活动在回收前一定会被调用,可以通过这个方法解决活动被回收时临时数据得不到保存的问题
八、活动的启动模式
启动模式一共有四种:standard,singleTop,singleTask,singleInstance,可以在AndroidManifest.xml中通过给标签指定的android:launchMode
属性来选择启动模式。
-
standard
默认的启动模式,在不进行显示指定的情况下,所有活动都会自动使用这个启动模式。在该模式下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。系统不会管这个活动是否存在栈中,每次启动新的活动都会创建一个该活动的实例。 -
singleTop
在启动活动的时候如果发现该活动在栈顶,则直接使用他,不会在创建新的活动。 -
singletask
在启动活动时,检查栈中存在该活动,如果栈中存在活动,则把这个活动之上的活动统统出栈,如果没有就会创建一个新的活动实例。