Android接收器未按预期执行

时间:2014-03-12 18:28:15

标签: android broadcastreceiver bootcompleted

老实说,他们根本没有做任何事情。首先我要说的是,我知道Android在3.1中重新设计了接收器,特别是启动控制。我知道他们这样做是为了除非用户先前已经启动了应用程序,否则无法使用ACTION_BOOT_COMPLETED。然而,人们已经成功地在当前应用程序中使用它们,但我从来没有在我的BOOT_COMPLETED或我的SHUTDOWN中点击我的接收器。

快速编辑 - 请查看此帖子的底部以更正关闭接收器,我已经让它工作了,现在我只是努力让BOOT_COMPLETED工作。

我的清单:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.smashingboxes.speedblock"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="12"
        android:targetSdkVersion="18" />

    <!-- PERMISSIONS -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

...

    <!-- RECEIVERS -->
    <receiver android:name=".BootReceiver"
        android:enabled="true" >
        <intent-filter>
           <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
    <receiver android:name=".ShutdownReceiver" >
       <intent-filter>
           <action android:name="android.intent.action.SHUTDOWN" />
       </intent-filter>
    </receiver>

现在我实现的接收器类非常简单:

BOOT_COMPLETED接收器(不工作的接收器)

public class BootReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context c, Intent i) {
        Intent starterIntent = new Intent(c, LaunchActivity.class);

        // Start the activity (by utilizing the passed context)
        starterIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        c.getApplicationContext().startService(starterIntent);  
    }
}

我根据解决方案的内容尝试了不同的东西,比如改变我的启动活动以包含

/* May need this, as of 3.1 we can't call BOOT_COMPLETED until the app has been run successfully */
Intent intent = new Intent("com.smashingboxes.speedblock.intent");
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
this.sendBroadcast(intent);

或将此包含在我的清单

中的启动接收器intent-filter中
<action android:name="android.intent.action.QUICKBOOT_POWERON" />

似乎没什么用。当Logs插入到我的接收器方法中时,它们永远不会被击中。显然人们仍然经常使用这两个接收器,这就是为什么我无法理解为什么它们都不起作用的原因。我在注册时遗漏了什么吗?

- 编辑 -

我用关机接收器解决了这个问题。首先,我愚蠢地忘记了标签的ACTION_部分。其次,HTC有单独的关机方法,在我的情况下我需要在我的Receiver请求中添加一个intent-filter:

 <receiver android:name=".ShutdownReceiver" >
     <intent-filter>
         <action android:name="android.intent.action.ACTION_SHUTDOWN" />
         <action android:name="android.intent.action.QUICKBOOT_POWEROFF" />
     </intent-filter>
 </receiver>

现在我的Shutdown Receiver正常工作,但仍然没有在Boot Completed Receiver上运气。

1 个答案:

答案 0 :(得分:0)

我找到了答案,我认为这一点非常重要,因为这似乎是其他人在某些时候遇到的问题。我的问题是我正在启动一个名为LauncherActivity的“Launcher Activity”。基本上,它是启动应用程序启动时启动服务,接收器等的门户。这是一个非常简单的Activity类:

public class LaunchActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    /* May need this, as of 3.1 we can't call BOOT_COMPLETED until the app has been run successfully */
    Intent intent = new Intent("com.smashingboxes.speedapp.intent");
    intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
    this.sendBroadcast(intent);
}

@Override
protected void onStart(){
    super.onStart();

    Intent serviceIntent = new Intent(this, MainService.class);
    startService(serviceIntent);

    // NOTE: It is VERY, VERY important that we DO NOT finish this activity.
    // If we do, our BootReceiver will no longer receive its broadcast and 
    // we won't auto-start on boot
    //finish();
}

}

请注意,我在LaunchActivity上调用了finish()。这个问题是它似乎告诉Android应用程序处于停止状态,这意味着它不允许接收BOOT_COMPLETED广播,即使我在后台运行了许多服务。 LauncherActivity必须在整个生命周期中保持活动状态,否则BOOT_COMPLETED接收器将变得无用。我之前没有提到的东西,但我认为值得注意的事情。