Статьи

Приемник вещания Android: включение и отключение во время выполнения

Приемник вещания является одним из основных и важных компонентов приложения Android. Существует два разных способа добавления широковещательного приемника в приложение Android. Он может быть добавлен либо программно, либо в файле Android Manifest. При добавлении широковещательного приемника следует соблюдать осторожность, поскольку ненужные широковещательные приемники расходуют заряд батареи. Если вы добавляете широковещательный приемник в файл манифеста Android, это означает, что вы собираетесь обрабатывать определенное намерение в широковещательном приемнике и не игнорировать его. Есть способ включить и отключить широковещательный приемник, который добавлен в файл манифеста.

Пример кода

Файл макета приложения.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<LinearLayout xmlns:android='http://schemas.android.com/apk/res/android'
    xmlns:tools='http://schemas.android.com/tools'
    android:layout_width='match_parent'
    android:layout_height='match_parent'
    android:orientation='vertical'>
 
     <Button
        android:layout_width='fill_parent'
        android:layout_height='wrap_content'
        android:padding='@dimen/padding_medium'
        android:text='@string/start_repeating_alarm'
        android:onClick='startRepeatingAlarm'
        tools:context='.EnableDisableBroadcastReceiver' />
     <Button
       android:layout_width='fill_parent'
       android:layout_height='wrap_content'
       android:padding='@dimen/padding_medium'
       android:text='@string/cancel_alarm'
       android:onClick='cancelAlarm'
       tools:context='.EnableDisableBroadcastReceiver' />
      
    <Button
        android:layout_width='fill_parent'
        android:layout_height='wrap_content'
        android:padding='@dimen/padding_medium'
        android:text='@string/enable_broadcast_receiver'
        android:onClick='enableBroadcastReceiver'
        tools:context='.EnableDisableBroadcastReceiver' />
   <Button
       android:layout_width='fill_parent'
       android:layout_height='wrap_content'
       android:padding='@dimen/padding_medium'
       android:text='@string/disable_broadcast_receiver'
       android:onClick='disableBroadcastReceiver'
       tools:context='.EnableDisableBroadcastReceiver' />
        
</LinearLayout>

В приведенном выше файле макета мы использовали несколько строковых констант в текстовом поле кнопок. Давайте определим эти строковые константы в string.xml, как показано ниже.

1
2
3
4
5
6
7
8
9
<resources>
    <string name='app_name'>EnableDisableBroadcastReceiver</string>
    <string name='enable_broadcast_receiver'>Enable Broadcast Receiver</string>
    <string name='disable_broadcast_receiver'>Disable Broadcast Receiver</string>
    <string name='start_repeating_alarm'>Start Repeating Alarm</string>
    <string name='cancel_alarm'>Cancel Alarm</string>
    <string name='menu_settings'>Settings</string>
    <string name='title_activity_enable_disable_boradcast_receiver'>EnableDisableBoradcastReceiver</string>
</resources>


Приемник вещания

Мы собираемся использовать AlarmManager, чтобы установить повторяющуюся тревогу, которая в конечном итоге отправляет намерение через определенный интервал времени. Прочтите этот пост, чтобы узнать больше о AlarmManager. Теперь создайте класс AlarmManagerBroadcastReceiver для расширения класса BroadcastReceiver. Содержание класса приведено ниже.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.code4reference.enabledisablebroadcastreceiver;
 
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.Date;
 
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.PowerManager;
import android.widget.Toast;
 
public class AlarmManagerBroadcastReceiver extends BroadcastReceiver {
 
 final public static String ONE_TIME = 'onetime';
 @Override
 public void onReceive(Context context, Intent intent) {
 
         //You can do the processing here update the widget/remote views.
         StringBuilder msgStr = new StringBuilder();
         //Format time.
         Format formatter = new SimpleDateFormat('hh:mm:ss a');
         msgStr.append(formatter.format(new Date()));
 
         Toast.makeText(context, msgStr, Toast.LENGTH_SHORT).show();
                  
 }
}


Включить / отключить широковещательный приемник

Теперь мы определим основное действие, которое использует alarmManager для установки повторяющегося сигнала тревоги. Повторяющийся сигнал будет транслироваться через каждые 3 секунды. Этот сигнал тревоги был установлен в методе setRepeatingAlarm () ниже.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package com.code4reference.enabledisablebroadcastreceiver;
 
import com.example.enabledisablebroadcastreceiver.R;
 
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
 
public class EnableDisableBroadcastReceiver extends Activity {
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    /**
     * This method gets called when 'Start Repeating Alarm' button is pressed.
     * It sets the repeating alarm whose periodicity is 3 seconds.
     * @param view
     */
    public void startRepeatingAlarm(View view)
    {
        AlarmManager am=(AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this, AlarmManagerBroadcastReceiver.class);
        PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 0);
        //After after 2 seconds
        am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 4 , pi);
        Toast.makeText(this, 'Started Repeating Alarm', Toast.LENGTH_SHORT).show();
    }
 /**
  * This method gets called when 'cancel Alarm' button is pressed.
  * This method cancels the previously set repeating alarm.
  * @param view
  */
    public void cancelAlarm(View view)
    {
        Intent intent = new Intent(this, AlarmManagerBroadcastReceiver.class);
        PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(sender);
        Toast.makeText(this, 'Cancelled alarm', Toast.LENGTH_SHORT).show();
    }
    /**
     * This method enables the Broadcast receiver registered in the AndroidManifest file.
     * @param view
     */
   public void enableBroadcastReceiver(View view){
    ComponentName receiver = new ComponentName(this, AlarmManagerBroadcastReceiver.class);
    PackageManager pm = this.getPackageManager();
 
    pm.setComponentEnabledSetting(receiver,
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP);
    Toast.makeText(this, 'Enabled broadcast receiver', Toast.LENGTH_SHORT).show();
   }
   /**
    * This method disables the Broadcast receiver registered in the AndroidManifest file.
    * @param view
    */
   public void disableBroadcastReceiver(View view){
    ComponentName receiver = new ComponentName(this, AlarmManagerBroadcastReceiver.class);
    PackageManager pm = this.getPackageManager();
 
    pm.setComponentEnabledSetting(receiver,
            PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
            PackageManager.DONT_KILL_APP);
    Toast.makeText(this, 'Disabled broadcst receiver', Toast.LENGTH_SHORT).show();
   }  
}

Мы добавляем AlarmManagerBroadcastReceiver в файл манифеста. Это регистрирует Broadcast Receiver.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    package='com.example.enabledisablebroadcastreceiver'
    android:versionCode='1'
    android:versionName='1.0' >
 
    <uses-sdk
        android:minSdkVersion='15'
        android:targetSdkVersion='15' />
    <application
        android:icon='@drawable/ic_launcher'
        android:label='@string/app_name'
        android:theme='@style/AppTheme' >
        <activity
            android:name='com.code4reference.enabledisablebroadcastreceiver.EnableDisableBroadcastReceiver'
            android:label='@string/title_activity_enable_disable_boradcast_receiver' >
            <intent-filter>
                <action android:name='android.intent.action.MAIN' />
                <category android:name='android.intent.category.LAUNCHER' />
            </intent-filter>
        </activity>
        <!-- Broadcast receiver -->
        <receiver android:name='com.code4reference.enabledisablebroadcastreceiver.AlarmManagerBroadcastReceiver' />
    </application>
</manifest>

После этого выполните код, и вы увидите приложение, как показано ниже.

Вы можете получить полный исходный код в github / Code4Reference . Вы можете найти больше учебных пособий по Android здесь.

Ссылка: Включите и отключите приемник Broadcast во время выполнения от нашего партнера JCG Ракеша Кусата в блоге Code4Reference .