快速编辑 - 请查看此帖子的底部以更正关闭接收器,我已经让它工作了,现在我只是努力让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上运气。
答案 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接收器将变得无用。我之前没有提到的东西,但我认为值得注意的事情。