Могу ли я по-прежнему получать широковещательный приемник после того, как я принудительно остановил свое приложение на android?
простой вопрос. Бывает ли так, что я все еще получаю зарегистрированные широковещательные приемники после того, как я принудительно остановил приложение?
4 ответов
Если ваши приемники зарегистрированы в AndroidManifest, то да, ваше приложение все равно получит его. С другой стороны, если вы регистрируетесь с помощью кода (в сервисе/деятельности), то приложение не получит его
бывает ли так, что я все еще получаю зарегистрированные широковещательные приемники после того, как я принудительно остановил приложение?
на Android 3.1+, нет. После того, как пользователь принудительно остановил ваше приложение, вы больше не будете получать трансляцию Intents
, любого рода, пока пользователь вручную не начнет одно из ваших действий.
вы не должны добавлять FLAG_INCLUDE_STOPPED_PACKAGES к намерению получателя, которые запускают вашу деятельность или службу. Вы должны добавить его в намерение, которое вы используете для sendBroadcast. Это означает, что вам нужно добавить его в намерение в приложении,которое вызывает трансляцию.
вот как вы должны вызвать свой приемник из другого приложения:
Intent intent = new Intent("com.xxx.my_filter_intent");
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
this.sendBroadcast(intent);
Если у вас нет контроля над этой трансляцией (например, если это системная трансляция) , и нет такого флаг внутри-тогда ваше приложение не будет запускаться этой трансляцией, если оно находится в состоянии остановки.
подробнее здесь:http://developer.android.com/about/versions/android-3.1.html#launchcontrols
используйте мой метод, если вы хотите запустить скрытое приложение только в первый раз, я делаю прозрачную активность запуска, как это
<activity android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/Theme.Transparent"
android:excludeFromRecents="true"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
поэтому я делаю приложение скрытым в launcher, поместив этот код в oncreat ()
PackageManager p = getPackageManager();
ComponentName componentName = new ComponentName(this, MainActivity.class);
p.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
поэтому я использую этот код для отображения значка приложения на пусковой установке и заставляю его работать в классе обслуживания, который использует загрузку широковещательного приемника и в классе широковещательного приемника сетевого подключения (автозапуск.java и networkConnectinCheck.Ява):
PackageManager p = context.getPackageManager();
ComponentName componentName = new ComponentName(context, MainActivity.class);
p.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
Теперь я могу запустить приложение в первый раз руками пользователя, и после этого я использую мой приемник обед приложение в любое время.