Android-广播总结

1.发送广播:

    其实发送广播属于隐式意图

        1.1.系统发出的广播(有序广播/无序广播)

       1.2自己发出的广播(有序广播/无序广播)

2.订阅广播:

        2.1.AndroidManifest.xml形式订阅接收者

        2.2.Java代码订阅广播(onCreate方法中订阅接收者(能够发现广播接收者是唯一可以new的组件),onDestroy方法里解除订阅,如果不解除订阅会引发泄露异常)

3.广播的生命周期方法:就一个方法

           onReceive(Context context, Intent intent)

             广播接收者组件,什么时候被激活,当执行 onReceive(Context context, Intent intent) 的时候被激活

           广播接收者组件,什么时候被回收,当执行完 onReceive(Context context, Intent intent) 后,系统会自动回收 

4.广播接收者,耗时操作

 onReceive(Context context, Intent intent) 方法不能执行耗时操作

  因为广播接收者是和Activity一样在主线程运行(Activity是五秒未响应就ANR异常,而广播接收者十秒未响应就ARN异常)

如果一定要在广播接收者里执行耗时操作,怎么办?

答:不能开启子线程,因为在执行完生命周期方法(onReceive(Context context, Intent intent) )后,系统会自动回收广播接收者,所以不能开子线程

  可以去开启一个服务-->服务再去开启主线程执行耗时操作 content.startService();   

5.广播接收者,去跳转Activity

AndroidManifest.xml 订阅 接收者

    <!--
            订阅(Xml形式订阅接收者)
            订阅接收者:专门去跳转Activity
        -->
        <receiver android:name=".br.StartActivityBroadcastReceiver">

            <intent-filter>

                <action android:name="my_customo.start_action_action" />

                <data android:scheme="startActivityScheme" />

            </intent-filter>

        </receiver>

接收者:

package liudeli.croadcast1.br;


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import liudeli.croadcast1.MainActivity;

/**
 * 此接收者,专门用来跳转Activity
 */
public class StartActivityBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        startActivity(context);
    }

    /**
     * 启动另外一个Activity
     */
    private void startActivity(Context context) {
        Intent intent = new Intent(context, MainActivity.class);
        /**
         * 注意:⚠️  在非Activity的地方 去启动Activity,必须加入以下标记
         *          intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         */
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }
}

发送广播:

 

  /**
     * 发送广播给 ---> 接收者
     */
    public void startActivity(View view) {
        /**
         * 订阅的信息:
         *            <intent-filter>
         *
         *                 <action android:name="my_customo.start_action_action" />
         *
         *                 <data android:scheme="startActivityScheme" />
         *
         *             </intent-filter>
         */
        /**
         * 发送广播原则,接收者怎么去订阅的,我就怎么去发送广播
         */
        Intent intent = new Intent();
        intent.setAction("my_customo.start_action_action");
        intent.setData(Uri.parse("startActivityScheme:我要激活另外一个Activity"));
        sendBroadcast(intent);
    }

 

效果:

         

猜你喜欢

转载自www.cnblogs.com/android-deli/p/10140715.html