BroadcastReceiver静态注册与动态注册的小细节

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private static final String ACTION_AUTO_FOR_TEST = "tn.intent.action.AUTO_TEST";
    public MyBroadcastReceiver myBroadcastReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /**
         Begin:动态注册
         NOTE:注册和注销广播的时机,最好成对出现。例如:

         1)onCreate(Bundle savedInstanceState)注册,在 onDestroy()方法中注销; (区别:即便页面未显示,仍然能接受广播)

         2)onResume()注册,在onPause()方法中注销。(区别:即只有页面显示时,才能接受广播)
         */
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(ACTION_AUTO_FOR_TEST);
        myBroadcastReceiver = new MyBroadcastReceiver();
        registerReceiver(myBroadcastReceiver, intentFilter);
        /**
         * END:动态注册
         */
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        /**
         * Begin:动态注册广播需要手动注销!
         */
        unregisterReceiver(myBroadcastReceiver);
        /**
         * END:动态注册广播需要手动注销!
         */

    }

    /**
     * 回调Button的点击事件
     */
    public void b1Click(View v) {
        long timenow = System.currentTimeMillis();
        Log.d("SunWinner", "timenow is = " + timenow);
        Intent intent = new Intent("tn.intent.action.AUTO_TEST");
        intent.setPackage("com.example.myapplication");
        intent.putExtra("test1", timenow);
        MainActivity.this.sendBroadcast(intent);
    }

    /**
     * 静态注册广播:public static class MyBroadcastReceiver extends BroadcastReceiver {
     */
    class MyBroadcastReceiver extends BroadcastReceiver {
        /**
         * 动态注册内部类广播
         * 

* 一般写在OnCreate 或者 OnStart等方法里面 */ @Override public void onReceive(Context context, Intent intent) { /** * Begin:动态注册接收广播方式 */ long timenow = intent.getLongExtra("test1", -1l); Toast.makeText(context, "My TimeNOW is " + timenow, Toast.LENGTH_SHORT).show(); /** * End:动态注册接收广播方式 */ /** * Begin:静态注册时接收广播方式 */ /* String action = intent.getAction(); if (action.equals(ACTION_AUTO_FOR_TEST)) { long timenow = intent.getLongExtra("test1", -1l); Toast.makeText(context, "My TimeNOW is " + timenow, Toast.LENGTH_SHORT).show(); }*/ /** * E:静态注册时接收广播方式 */ } } /** * 静态注册,且广播做为内部类时需要注意的事项: * * 1)清单文件中广播的声明格式为: * com.example.myapplication.MainActivity$MyBroadcastReceive * 包名.类名$内部类名 * * 2)广播类声明时需要加上public static class MyBroadcastReceiver....,否则启动会报错。 * * 3)静态注册广播时需要在清单文件注册: * * * * */ }

上图的状态为动态注册的方式;静态注册的方式相关代码也在其中,暂被注释.总结:

 

1)动态注册

注册和注销广播的时机,最好成对出现。例如:

1)onCreate(Bundle savedInstanceState)注册,在 onDestroy()方法中注销; (区别:即便页面未显示,仍然能接受广播)

2)onResume()注册,在onPause()方法中注销。(区别:即只有页面显示时,才能接受广播)

2)静态注册

     1)清单文件中广播的声明格式为:
     com.example.myapplication.MainActivity$MyBroadcastReceive
     包名.类名$内部类名
     2)广播类声明时需要加上public static class MyBroadcastReceiver....,否则启动会报错。
     (动态注册时不需要特意加public static class也不会报错)
     3)静态注册广播时需要在清单文件注册:
    
        
            
            
        
    

 

你可能感兴趣的:(工作总结输出)