如果安装了另一个应用程序,则BOOT_COMPLETED接收器无法正常工作

时间:2014-03-20 15:54:11

标签: android broadcastreceiver bootcompleted

基本上我有一个这样的启动接收器:

<receiver
        android:name="com.xxx.xxx.XXX.BootUpReciever"
        android:enabled="true"
        android:exported="true"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
        <intent-filter android:priority="999" >
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.QUICKBOOT_POWERON" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver> code here

现在这似乎在大多数情况下都能正常工作。它将在启动时启动并继续执行它需要做的事情。但是,如果我将其与我开发的另一个应用程序结合起来,那么尽管仍在注册,接收器永远不会被调用。

我总是确保先运行应用程序以便注册,所以不是这样。如果我卸载其他应用程序,它可以工作。他们确实有一个共享用户,但我不认为这与它有很大关系,因为我在许多应用程序中使用它们可以很好地组合使用。这只是一个与之不相配的特定应用程序。

编辑:

我确实有<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />,否则根本无效。

启动接收器本身:

public class BootUpReciever extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent args) {
    incBootCounter(context);
    Intent i = new Intent(context, HomeScreenActivity.class);  
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(i);
}

private void incBootCounter(Context ctx) {
    SharedPreferences s = PreferenceManager.getDefaultSharedPreferences(ctx);
    if (s != null) {
        Editor edit = s.edit();
        if (edit != null) {
            edit.putInt("how_many_times_have_we_booted", s.getInt("how_many_times_have_we_booted", 0) + 1);
            edit.commit();
        }
    }
}

}

请注意,这不是Google Play商店或其他任何应用程序。这是一个非常具体的应用程序,仅部署到我们作为公司拥有的设备上。

编辑2:

我在日志中找到了一些帮助。安装其他应用程序后,我收到此消息:

W/BroadcastQueue(  986): Permission Denial: receiving Intent { act=android.intent.action.BOOT_COMPLETED flg=0x8000010 (has extras) } to com.xxx.xxx.xxxxxxxxx/.BootUpReciever requires android.permission.RECEIVE_BOOT_COMPLETED due to sender null (uid 1000)

没有其他应用程序,我收到此消息:

I/ActivityManager(  980): Start proc com.xxx.xxx.xxxxxx for broadcast com.sps.smc.SMCKiosk/.BootUpReciever: pid=1656 uid=10109 gids={50109, 3003, 3002, 3001, 1028, 1015}

2 个答案:

答案 0 :(得分:1)

尝试类似:

public void onReceive(Context context, Intent intent) {
   if (intent.getAction().equalsIgnoreCase(Intent.ACTION_BOOT_COMPLETED)) {
      if (context != null) {
        // your codes here
      }
   }
}

第一次检查确保只处理等于Intent.ACTION_BOOT_COMPLETED的操作。第二次检查确保只使用有效的上下文来执行代码。

此外,AndroidManifest.xml应具有以下声明:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver
   android:name="com.xxx.xxx.XXX.BootUpReciever">
   <intent-filter android:priority="999" >
      <action android:name="android.intent.action.BOOT_COMPLETED" />
      <action android:name="android.intent.action.QUICKBOOT_POWERON" />    
      <category android:name="android.intent.category.DEFAULT" />
   </intent-filter>
</receiver>

答案 1 :(得分:0)

管理解决它。

我的问题是因为它是一个共享用户,我必须将权限放在另一个清单中(或者至少我认为这就是问题所在)。

出于某种原因,它正在撤销它,因为它不在两个清单中。为什么它在没有相同权限镜像的情况下与其他应用程序中的同一共享用户一起工作,此时我不知道。可能是它在猜测时加载包的顺序。