Могу ли я по-прежнему получать широковещательный приемник после того, как я принудительно остановил свое приложение на 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);

Теперь я могу запустить приложение в первый раз руками пользователя, и после этого я использую мой приемник обед приложение в любое время.