APP在未启动的情况下无法收到静态广播

最近项目上遇到了一个需求,APP在未启动时需要后台进行一些初始化操作,即在未点击应用launcher图标时,已经在后台运行了。首先想到的就是桌面级应用可以通过注册静态广播被系统级应用主动拉起。

  1. 思考:初始化工作可以放在桌面级应用的Application中进行,系统应用在发送静态广播后,Android 系统会检索已安装应用注册的所有静态广播,找到之后,系统先执行该应用Application中的oncreate方法,然后执行BroadcastReceiver中的onReceiver方法,此过程即可达到目的。
  2. 但现象是:程序安装后,在未启动的情况下无法接收到系统的广播;但在启动一次后,就能够正常收到系统广播。
  3. 查阅资料后了解到,从Android 3.1开始,系统给Intent定义了两个新的Flag,分别为:
		 FLAG_INCLUDE_STOPPED_PACKAGES(表示包含未启动的App)
		 FLAG_EXCLUDE_STOPPED_PACKAGES(表示不包含未启动的App),
		 用来控制Intent是否要对处于停止状态的App起作用,具体的操作方式如下`:
	(1)在发送广播的应用中添加如下代码段:
		Intent intent = new Intent();
		intent.setAction("com.iflytek.cutefly.speechclient");
		intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
		sendBroadcast(intent);
	(2)在需要接收广播的应用中静态注册广播,并定义好action,并且
	需要指定android:exported="true";
		<receiver android:name=".receiver.BootReceiver"
		   android:exported="true">
		   <intent-filter>
		        <action android:name="com.iflytek.cutefly.speechclient"/>
		   </intent-filter>
		 </receiver>
	(3)最后,切记生成的apk需要push到系统system/app目录中。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Android 应用关闭时触发定时广播,可以使用 Android 的广播接收器和服务。以下是实现步骤: 1. 创建一个 BroadcastReceiver 类,用于接收定时广播。例如: ``` public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 处理定时广播 } } ``` 2. 在 AndroidManifest.xml 文件中注册 BroadcastReceiver。例如: ``` <receiver android:name=".MyBroadcastReceiver" /> ``` 3. 创建一个 Service 类,用于在后台运行广播。例如: ``` public class MyService extends Service { private BroadcastReceiver mBroadcastReceiver; private PendingIntent mPendingIntent; @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); // 创建定时广播 mBroadcastReceiver = new MyBroadcastReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("com.example.myapp.MY_BROADCAST"); registerReceiver(mBroadcastReceiver, intentFilter); // 创建 PendingIntent Intent intent = new Intent("com.example.myapp.MY_BROADCAST"); mPendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0); // 启动定时器 AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); long interval = 60 * 1000; // 每分钟触发一次广播 long startTime = System.currentTimeMillis(); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, startTime, interval, mPendingIntent); } @Override public void onDestroy() { super.onDestroy(); // 取消定时广播 unregisterReceiver(mBroadcastReceiver); AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); alarmManager.cancel(mPendingIntent); } } ``` 4. 在应用关闭的时候启动 Service。例如: ``` @Override protected void onDestroy() { super.onDestroy(); Intent intent = new Intent(this, MyService.class); startService(intent); } ``` 这样,当应用关闭时,就会启动 MyService,并在后台运行定时广播。注意,当应用重新启动时,MyService 也会重新启动,需要在 MyService 中处理这种情况

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值