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)静态注册广播时需要在清单文件注册: