Ответ 1
Причина, по которой ваш BroadcastReceiver
не вызывается, заключается в том, что ваше приложение все еще находится в состоянии "остановлено". В вашем приложении нет компонентов Activity
. Это означает, что после установки приложения пользователю не удастся его запустить. Приложения, которые никогда не запускались пользователем, остаются в "остановленном состоянии". Приложения в "остановленном состоянии" не будут получать трансляции..
См. раздел "Управление запуском остановленных приложений" в http://developer.android.com/about/versions/android-3.1.html
EDIT: добавьте более подробную информацию о Intent.ACTION_QUERY_PACKAGE_RESTART
в Android 4.x
Похоже, это поведение изменилось с Android 2.3 (я не уверен в Android 3.x). В Android 4.0 и выше код в InstalledAppDetails
(часть приложения "Настройки" ) выглядит следующим образом:
private void checkForceStop() {
if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
// User can't force stop device admin.
updateForceStopButton(false);
} else if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) {
// If the app isn't explicitly stopped, then always show the
// force stop button.
updateForceStopButton(true);
} else {
Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
Uri.fromParts("package", mAppEntry.info.packageName, null));
intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName });
intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid);
getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null,
Activity.RESULT_CANCELED, null, null);
}
}
Итак, если отображаемое приложение является администратором устройства, кнопка "принудительная остановка" будет отключена. Если отображаемое приложение не остановлено, тогда кнопка "принудительная остановка" будет включена. В противном случае будет транслироваться Intent.ACTION_QUERY_PACKAGE_RESTART
.
Это означает, что Intent
будет транслироваться только для приложений, не связанных с устройством, которые уже были остановлены.
Я тестировал это на устройстве 4.0 с вашим кодом. Если вы установите приложение, перейдите к Settings->Apps
и выберите другое приложение (не ваше), которое было принудительно остановлено, ваш onReceive()
вызывается с помощью Intent.ACTION_QUERY_PACKAGE_RESTART
.
Я понял, что это, вероятно, не очень помогает, но по крайней мере объясняет поведение, которое вы видите.
Жаль, что для этого не потребовалось столько времени, и спасибо за вызов: -)