我尝试了很多不同的例子,经过一段时间(很长一段时间),我终于在通知(通过服务)之后(几乎)接收了来自BroadcastReceiver的日志。问题仍然存在。
当我安装apk或构建它并在usb上运行时,BroadcastReceiver没有收到意图。我尝试手动运行应用程序十几次,然后重新启动(打开/关闭)我的手机 - 什么都没有。之后,我尝试使用adb shell调试它:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n com.myapp.example / .BootCompletedReceiver
而且,瞧!有效。我用重启检查 - 它工作了!之后,我重新启动了应用程序,并再次 - 没有工作。在我尝试使用adb shell之后 - 一切正常。 这样的接缝应该可以工作,但只有在我第一次从上面运行adb shell命令之后才能使用。
我没有尝试使用AVD(在我的机器上速度太慢),只是使用我的HTC ONE(我也检查过HTC ONE问题,知道某些版本的HTC存在问题电话 - 没有任何帮助。)
这是我的清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.myapp.example" >
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppThemeWhiteActionBar" >
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@style/AppThemeWhite" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
...
<receiver android:name=".BootCompletedReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
<receiver android:name=".util.AlarmReceiver"/>
<service android:name=".NotifyingDailyService" >
</service>
</application>
这些是BootCompletedReceiver和NotifyingDailyService(与此处的许多示例几乎相同):
public class BootCompletedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent arg1) {
Log.w("boot_broadcast_poc", "starting service...");
context.startService(new Intent(context, NotifyingDailyService.class));
}
}
public class NotifyingDailyService extends Service {
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent pIntent, int flags, int startId) {
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Notification.Builder builder = new Notification.Builder(this);
builder.setSmallIcon(R.drawable.ic_launcher);
builder.setContentTitle(getString(R.string.random_string));
builder.setContentText(getString(R.string.random_string));
builder.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE | Notification.DEFAULT_LIGHTS);
mNotificationManager.notify(12345, builder.build());
return super.onStartCommand(pIntent, flags, startId);
}
}
答案 0 :(得分:0)
安装不足以让您的应用开始收听BOOT_COMPLETED
广播。应用程序需要启动一次,即您的自定义应用程序类或条目活动需要启动一次,BroadcastReceiver
才能听到BOOT_COMPLETED
系统广播。出于安全原因,此行为是设计使然。
您可以通过CommonsWare在此blog上阅读更多相关信息。
答案 1 :(得分:0)
可以选择限制Android中的启动应用程序。我想你的申请也受到限制。转到设置 - &gt;个人 - &gt;启动管理器。在那里,您可以允许或限制boot_completed广播接收。