详解 Android 组件 Activity 和 Broadca

作者: uniapp | 来源:发表于2018-08-08 11:44 被阅读11次
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 的使用,不但进行了理论叙述,而且进行了代码示例。希望能够帮助到需要的小伙伴儿。

关注和喜欢都是对我的鼓励和支持~

相关文章

网友评论

    本文标题:详解 Android 组件 Activity 和 Broadca

    本文链接:https://www.haomeiwen.com/subject/tpvtbftx.html