Android广播接收器(BroadcastReceiver)的启动优先级问题

本文详细介绍了Android中广播接收器(BroadcastReceiver)的分类,包括标准广播和有序广播,并分析了不同情况下广播接收器的启动优先级。在标准广播中,动态注册的接收器优先于静态注册的接收器启动;而在有序广播中,优先级高的接收器优先启动,动态注册的接收器在优先级相同时也会优先于静态注册的接收器启动。同时,动态注册的广播接收器生命周期与Activity相关,需要在适当时候取消注册。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android中有两个概念:广播(Broadcast)和广播接收器(BroadcastReceiver),Android系统会发送系统广播,应用程序也可以发送自定义广播。同时应用程序可以通过注册广播接收器来接收各种广播。

1.广播的分类

而无论是系统广播还是自定义广播,都有两种类型:标准广播和有序广播。

(1)标准广播(Normalbroadcast):标准广播通过调用sendBroadcast()方法发送,该广播是异步执行发送的,手机中不同应用程序中的广播接收器可以同时接收到标准广播。

(2)有序广播(Orderedbroadcast):有序广播通过调用sendOrderedBroadcast()方法发送,该广播是同步发送的,应用程序中优先级高的广播接收器先接收到该广播,然后再由该广播接收器将广播传给优先级低的广播接收器,并且优先级高的广播接收器可以通过调用abortBroadcast()方法阻断广播的传送,这样低优先级的广播接收器就无法收到该广播。

2.广播接收器的注册方式

广播接收器有两种注册方式:(1)在代码中动态注册.(2)在AndroidManiFest.xml文件中静态注册。无论哪种方式,都要创建一个广播接收器类继承自Broadcast类。

(1)动态注册:动态注册的广播接收器需要在代码中调用registerReceiver()方法来注册广播接收器,该方法接收两个参

@SuppressLint("NewApi") public class MainActivity extends Activity { SmsReceiver myReceiver; Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { test(); } }); } public void test(){ Cursor cursor = null; String defaultSmsApp = Telephony.Sms.getDefaultSmsPackage(this); Intent intent = new Intent(Sms.Intents.ACTION_CHANGE_DEFAULT); intent.putExtra(Sms.Intents.EXTRA_PACKAGE_NAME, this.getPackageName()); startActivity(intent); try { cursor = getContentResolver().query(Uri.parse("content://sms/inbox"), new String[] { "_id", "address", "read" }, "read = ? ", new String[] {"0" }, "date desc"); if (cursor != null) { ContentValues values = new ContentValues(); values.put("read", "1"); for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { Log.v("cky", "" + cursor.getInt(cursor.getColumnIndex("_id")) + " , " + cursor.getString(cursor.getColumnIndex("address"))); int res = getContentResolver().update(Uri.parse("content://sms/inbox"), values, "_id=?", new String[] { "" + cursor.getInt(cursor.getColumnIndex("_id")) }); Log.i("cky","geng xin = "+res); } } intent = new Intent(Sms.Intents.ACTION_CHANGE_DEFAULT); intent.putExtra(Sms.Intents.EXTRA_PACKAGE_NAME, defaultSmsApp); startActivity(intent); } catch (Exception e) { e.printStackTrace(); } finally { if (cursor != null) { cursor.close(); cursor = null; } } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值