0
点赞
收藏
分享

微信扫一扫

浅谈Android BroadcastReceiver,androidapk性能优化

//获取程序中的button按钮

button = (Button) findViewById(R.id.button);

button.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

//创建Intent对象

Intent intent = new Intent();

intent.setAction(“com.example.broadcast.MyBroadcast”);

intent.putExtra(“msg”, “简单的消息”);

//发送有序广播

sendOrderedBroadcast(intent,null);

}

});

第一个接收者

public class MyBroadcastReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

System.out.println(“MyReceiver called”);

Toast.makeText(context,

“接收到的Intent的Action为”+intent.getAction()

+"\n消息内容是:"+intent.getStringExtra(“msg”),

Toast.LENGTH_SHORT).show();

//创建Bundle对象并存入数据

Bundle bundle = new Bundle();

bundle.putString(“first”,“第一个BroadcastReceiver存入的消息”);

//将Bundle放入结果中

setResultExtras(bundle);

}

}

第二个接收者

public class MyBroadcastReceiver2 extends MyBroadcastReceiver{

@Override

public void onReceive(Context context, Intent intent){

System.out.println(“MyReceiver called”);

Bundle bundle = getResultExtras(true);

//解析前一个BroadcastReceiver所存入得到key为first的消息

String first = bundle.getString(“first”);

Toast.makeText(context,“第一个BroadcastReceiver存入的消息:”

+first,Toast.LENGTH_LONG).show();

}

}

效果如下:

Android系统当中自带的Broadcast Action


如果应用需要在系统特定时刻执行某些操作,就可以通过监听系统广播来实现。Android的大量系统事件都会对外发送标准广播。下面是Android常见的广播Action常量

  • ACTION_TIME_CHANGED:系统事件被改变

  • ACTION_DATE_CHANGED:系统日期被改变

  • ACTION_TIMEZONE_CHANGED:系统时区被改变

  • ACTION_BOOT_COMPLETED:系统启动完成

  • ACTION_PACKAGE_ADDED:系统添加包

  • ACTION_PACKAGE_CHANGED:系统的包改变

  • ACTION_PACKAGE_REMOVED:系统的包被删除

  • ACTION_PACKAGE_RESTARTED:系统的包被重启

  • ACTION_PACKAGE_DATA_CLEARED:系统的包数据被清空

  • ACTION_BATTERY_CHANGED:电池电量改变

  • ACTION_BATTERY_LOW:电池电量低

  • ACTION_POWER_CONNECTED:系统连接电源

  • ACTION_POWER_DISCONNECTED:系统与电源断开

  • ACTION_SHUTDOWN:系统被关闭

通过使用BroadcastReceiver来监听特殊的广播,即可让应用随系统执行特定的操作。

使用广播接收器的一般步骤


1.实现一个广播接收器,继承自BroadcastReceiver类,重写onReceive()方法

注意不要在onReceive() 方法中添加过多的逻辑或者进行任何的耗时操作,因为在广播接收器中是不允许开启线程的, 如果BroadcastReceiver的onReceiver()方法不能在10秒内执行完成,Android会认为该程序无响应,会弹出ANR(Application No Response)对话框。

如果确实需要根据Broadcast来完成一项比较耗时的操作,则可以考虑通过Intent启动一个Service来完成该操作。

2.注册广播接收器

广播接收器的注册方法有两种:静态注册和动态注册

静态注册

在清单配置文件中声明,即使进程被杀死,该广播仍然运行。

可惜的是在清单文件进行静态注册这种方式在Android8.0,API26以后已经不能使用了。

动态注册

在代码中注册,受activity生命周期的影响。

在这里稍微说一下,在Context这个类当中提供了如下两个函数:

  • registerReceiver(receiver,filter);

这个函数的作用就是将一个BroadcastReceiver注册到应用程序当中,这个函数接收两个参数,第一个参数是需要注册的BroadcastReceiver对象,第二个是一个IntentFilter。第一个参数是非常容易理解的,第二个参数的作用是定义了哪些Intent才能触发这个注册的BroadcastReceiver对象。

  • unregisterReceiver(receiver);

这个方法就非常简单了,用于解除BroadcastReceiver的绑定状态。一旦解除完成,响应的BroadcastReceiver就不会再接收系统所广播的Intent了。

public class MainActivity extends AppCompatActivity {

private MyBroadcastReceiver receiver;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//动态注册

IntentFilter filter = new IntentFilter();

//广播接收器想要监听什么广播, 就在这里add相应的action

filter.addAction(“android.intent.action.BOOT_COMPLETED”);

receiver = new MyBroadcastReceiver();

//注册

registerReceiver(receiver,filter);

}

@Override

//当Activity不可见或者销毁时,解除注册

protected void onStop(){

super.onStop();

unregisterReceiver(receiver);

}

}

实例介绍(动态注册——监听网络变化)


MainActivity.java

public class MainActivity extends AppCompatActivity {

private NetWorkChangeReceiver receiver;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

IntentFilter filter = new IntentFilter();

filter.addAction(“android.net.conn.CONNECTIVITY_CHANGE”);

receiver = new NetWorkChangeReceiver();

registerReceiver(receiver,filter);

}

@Override

protected void onStop(){

super.onStop();

unregisterReceiver(receiver);

}

}

NetWorkChangeReceiver.java

public class NetWorkChangeReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent){

ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo networkInfo = manager.getActiveNetworkInfo();

if (networkInfo!=null&&networkInfo.isAvailable()){

Toast.makeTe
xt(context,“网络可用”, Toast.LENGTH_SHORT).show();

}else {

Toast.makeText(context,“网络不可用”,Toast.LENGTH_SHORT).show();

}

}

}

最后在AndroidManifest.xml清单文件中添加权限

xt.CONNECTIVITY_SERVICE);

NetworkInfo networkInfo = manager.getActiveNetworkInfo();

if (networkInfo!=null&&networkInfo.isAvailable()){

Toast.makeTe[外链图片转存中…(img-qOg5c8pK-1642524812258)]
xt(context,“网络可用”, Toast.LENGTH_SHORT).show();

}else {

Toast.makeText(context,“网络不可用”,Toast.LENGTH_SHORT).show();

}

}

}

最后在AndroidManifest.xml清单文件中添加权限

举报

相关推荐

0 条评论