2

基本上我已经设置了一个引导接收器,如下所示:

<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}
4

2 回答 2

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>
于 2014-03-20T16:18:48.127 回答
0

设法解决它。

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

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

于 2014-03-20T16:38:52.640 回答