Activity 的生命周期
Activity 属于 Android 中最常见、应用最多的组件。它用来展示 UI 界面,我们学习的第一个 Android 应用都是从 MainActivity 开始的。Activity 生命周期是手机上的 Android 系统在运行时暴露出来的接口。网上的讲解很多也很细,下面我从小白理解的角度叙述一下。一共 3 对,6 个时刻。
1 onCreate/onDestroy 页面 Activity 创建和销毁时刻。创建时初始化控件,比如设置页面元素、注册通知等;销毁时释放内存(CPU)资源,比如解除通知的监听、释放播放器等。
2 onStart/onStop 页面将要展示和页面将要消失时。页面将要展示时,也即是进入前台时,调用 onStart 方法;页面将要消失,进入后台时,调用 onStop 方法;
3 onResume/onPause 页面获得焦点和失去焦点时。这个理解起来比较费劲儿,当 Activity1 弹出 透明的 Activity2 时, Activity1 的就会失去失去焦点;Activity2 弹出时,Activity1 重新获得焦点;
生命周期的前后流程为 onCreate、onStart、onResume、onPause、onStop、onDestroy。当然还有 onRestart 、 onPostxxx 等,这些用到的不多,可以随着技术的加深,逐步学习。
Activity 有 4 种启动模式 (launchMode)
Android 中的每一个应用都会有一个任务栈,用来存放新创建的 Activity 。就像一本书的内容一样,Activity 一层一层的叠加,用户就看到了不同的内容。Activity 不同的启动方式,会造成该 Activity 在任务栈中不同的存在方式。
1 Standard 每一次都会新建一个实例,放到任务栈中,这种最容易理解;
2 SingleTop 当 Activity 类 A1 有一个实例 a 处于栈顶时,再次创建 A1 时,就会使用 a ,而不会创建新的实例。
3 SingleTask 只会创建一个该 Activity1 类的实例 a1 。再次使用 Activity1 时,会继续使用 a1 。 并且如果 a1 不处于 栈顶,就会将前面的所有实例推出任务栈;
4 SingleInstance 只会创建一个该 Activity1 类的实例 a1,a1 被放在一个和任务栈独立的栈中,当使用 Activity1 时,他就会放在任务栈的最前面;
Broadcast 广播
通过 Broadcast ,可以监听到 Android 中的很多事件。比如开机启动、设置变化、电话、短信以及 App 的安装和卸载等。使用 Broadcast, 首先新建继承至 BroadcastReceiver
的类 A,然后在清单文件 AndroidManifest 中注册 A , 最后在需要的地方通过 Intent 发送通知。
1 新建 MyReceiver;
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Toast.makeText(context, "xxxx" + action + "xxxx", Toast.LENGTH_SHORT).show();
}
}
2 注册
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="com.uniapp.cast"/>
</intent-filter>
</receiver>
3 发送
public void sendBroadcast(View view) {
Intent intent = new Intent();
intent.setAction("com.uniapp.cast");
sendBroadcast(intent);
}
广播分为无序和有序两种。
通过有序广播,可以实现广播的层层传递,接受到广播的中间类可以修改广播,然后在向下层传递。
1 发送有序广播
public void sendOrderBroadcast(View view) {
Intent intent = new Intent();
intent.setAction("com.uniapp.ordercast");
sendOrderedBroadcast(intent,null,null,null,1,"好的",null);
}
2 通过在清单文件中的 priority 定义接受广播的顺序
<receiver android:name=".Receiver_zhongyan">
<intent-filter android:priority="1000">
<action android:name="com.uniapp.ordercast"/>
</intent-filter>
</receiver>
<receiver android:name=".Receiver_shengji">
<intent-filter android:priority="800">
<action android:name="com.uniapp.ordercast"/>
</intent-filter>
</receiver>
public class Receiver_zhongyan extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String data = getResultData();
Toast.makeText(context, "中央" + data, Toast.LENGTH_SHORT).show();
setResultData("不好");
}
}
public class Receiver_shengji extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String data = getResultData();
Toast.makeText(context, "省级" + data, Toast.LENGTH_SHORT).show();
}
}
广播也可以监听屏幕的亮起和关闭,但是因为这种事件频率太高,Google 规定只能通过注册来实现。
1 创建监听类
public class ReceiverScreenOnOff extends BroadcastReceiver {
private static final String TAG = "ReceiverScreenOnOff";
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "onReceive: " + intent.getAction());
}
}
2 在 Activity 中注册事件监听
ReceiverScreenOnOff screenOnOff;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
screenOnOff = new ReceiverScreenOnOff();
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.SCREEN_OFF");
filter.addAction("android.intent.action.SCREEN_ON");
registerReceiver(screenOnOff, filter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(screenOnOff);
}
总结
文章首先介绍了 Activity 组件的生命周期,以及列举了各个阶段能够处理的问题,接着介绍了 Activity 4 种不同的启动模式。接下来对广播 Broadcast 的使用,不但进行了理论叙述,而且进行了代码示例。希望能够帮助到需要的小伙伴儿。
网友评论