Статьи

Android Broadcast Receiver — изменение потока с API 3.1

До API 3.1 у нас мог быть широковещательный приемник, который мог быть вызван неявным намерением, даже если приложение, к которому оно принадлежало, находилось в остановленном состоянии.

Но это представляло угрозу безопасности. Следовательно, Google сделал обязательным, чтобы любой получатель вещания получал намерение, чтобы была активность, и приложение не должно быть в остановленном состоянии. Вот ссылка для дальнейшего чтения.

Когда приложение запускается, оно находится в остановленном состоянии и, следовательно, оно обязывает пользователя активировать приложение, которое имеет приемник вещания. Если приложение принудительно остановлено пользователем, то снова получателю широковещательной передачи не удается получить намерение. Следовательно, apk, имеющий только широковещательный приемник и разработанный на версии до 3.1, больше не будет работать для более поздних версий.
Однако можно использовать FLAG_INCLUDE_STOPPED_PACKAGES для активации компонентов в остановленном приложении. Это не потребует создания другого действия для использования приемника вещания.

1
2
Intent intent = new Intent("com.custom.intent"); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
this.sendBroadcast(intent);

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

1
2
3
4
5
6
7
PackageManager pm = getPackageManager();
Intent appStartIntent =
pm.getLaunchIntentForPackage("com.your.broadcast.receiver.package");
if (null != appStartIntent)
{
     startActivity(appStartIntent);
}

Если это не приложение запуска, вам нужно указать категорию как INFO в фильтре намерений в файле манифеста приемника вещания.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" <
       <activity
            android:name=".InvokedActivity"
            android:label="@string/app_name"<
            <intent-filter<
                <action android:name="android.intent.action.MAIN" /<                        
               <category android:name="android.intent.category.INFO" / <
<-- If the activity is a launcher then mention this instead
             <category android:name="android.intent.category.LAUNCHER" /
                             < --<
 
             </intent-filter <
        </activity <
       <receiver android:name=".TestBroadCastReceiver" <
           <intent-filter <
           <action android:name="com.custom.intent" <
          </action <
        </intent-filter <
       </receiver <
<application <
    

Вот код для BroadCastReceiver:

01
02
03
04
05
06
07
08
09
10
public class TestBroadCastReceiver extends BroadcastReceiver {
  
    private static final String CUSTOM_INTENT = "com.custom.intent";
     
    public void onReceive(Context context, Intent intent) {
         if (intent.getAction().equals(CUSTOM_INTENT)) {
              //your code here
         }
    }
}

Код для InvokedActivity:

1
2
3
4
5
6
7
8
9
public class InvokedActivity extends Activity {
       
       public void onCreate(Bundle b) {
             super.onCreate(b);
             /*Toast.makeText(this, "starting xyz receiver...blah blah :)", Toast.LENGTH_LONG) .show();*/
             finish();
      }
}
  

Ссылка: широковещательный приемник — изменение в потоке с API 3.1 от нашего партнера JCG Ашимиты Адусумилли из блога « Мой маленький мир Android» .