Есть ли способ сохранить повторяющийся сигнал тревоги после создания приложения, использующего широковещательный приемник?

#android #broadcastreceiver #alarmmanager

#Android #broadcastreceiver #alarmmanager

Вопрос:

Я новичок в Android. Я пытаюсь создать приложение, которое использует BroadcastReceiver для выполнения функции основного действия, вызванного повторяющимся сигналом тревоги. Я читал, что мне пришлось динамически регистрировать broadcastReceiver то, что я сделал — это для того, чтобы иметь возможность выполнять функцию в основном действии. Проблема, с которой я сталкиваюсь, заключается в том, что как только приложение выходит, alarm оно перестает работать. Я читал, что это сделано специально — есть ли способ преодолеть это или мне нужно использовать service ? Заранее спасибо.

Пример кода:

 public class AlarmReceiver extends BroadcastReceiver {  
    @Override  
    public void onReceive(Context context, Intent intent) {  
        Toast.makeText(context, "from AlarmReceiver", Toast.LENGTH_SHORT).show();  
    }
}

public class MainActivity extends AppCompatActivity {  
    private PendingIntent pendingIntent;  
    private AlarmManager manager;  
    private AlarmReceiver myReceiver = null;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        myReceiver = new AlarmReceiver();  
        IntentFilter myIntentFilter = new IntentFilter("ANY_ACTION");  
        registerReceiver(myReceiver,  myIntentFilter);  
        Intent myIntent = new Intent();  
        myIntent.setAction("ANY_ACTION");  
        pendingIntent = PendingIntent.getBroadcast(this, 0,myIntent,0);  
    }  
      public void startAlarm(View view) {  
        manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);  
        int interval = 1500;  
        manager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),   interval, pendingIntent);  
        Toast.makeText(this, "Alarm Set", Toast.LENGTH_LONG).show();  
    }     
}
 

Комментарии:

1. Покажите свой код, сигналы тревоги работают, даже когда ваше приложение не запущено. developer.android.com/training/scheduling/alarms.html

2. Спасибо, Умаров, я добавил пример кода, который показывает мою точку зрения, которая заключается в том, что когда приложение is существует, сообщения от AlarmReceiver перестают отображаться.

Ответ №1:

Я думаю, причина, по которой ваш будильник перестает работать, когда ваше приложение не запущено, заключается в том, что вы регистрируете свой AlarmReceiver локально registerReceiver . Если вы хотите зарегистрировать свой AlarmReceiver, чтобы он продолжал работать, даже когда ваше приложение не запущено, вам нужно зарегистрировать его внутри AndroidManifest.xml .

Во-первых, добавьте ваш приемник в AndroidManifest.xml вот так:

   <application>    
       //...
       <receiver android:name=".AlarmReceiver">
        </receiver>
       //...
  </application>
 

И установите будильник следующим образом (помните: не устанавливайте слишком короткий интервал будильника, установите не менее 1 минуты; вы устанавливаете интервал 1,5 секунды в коде ur — это может не сработать):

     int interval = 60 * 1000;
    Intent intent=new Intent(this, AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1, intent, 0);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);
 

И просто делайте то, что вы хотите сделать, когда срабатывает сигнал тревоги внутри onRecieve:

 public class AlarmReceiver extends BroadcastReceiver {
     @Override
     public void onReceive(Context context, Intent intent) {

    AudioManager audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
    SharedPreferences sharedPreferences = context.getSharedPreferences("Settings", 0);
    int iDefValue=0; 
    int iDayAlarmVal= sharedPreferences.getInt("something", iDefValue); 
    // and so on...
                 }
         }
 

Комментарии:

1. Еще раз спасибо. Если я зарегистрирую его в манифесте, сигнал тревоги сработает, правда, но, как упоминалось вверху, мне нужно динамически зарегистрировать его, чтобы иметь возможность вызывать функцию, определенную в Main-Activity. Где вы упоминаете «// … на самом деле мне нужно вызвать функцию, которая определена в основном действии.

2. что именно вы хотите делать при срабатывании будильника?

3. Для вызова функции, определенной в основном действии, т.Е. onReceive (…), будет иметь что-то вроде «myMain. DayExecute();» который определен в основном действии.

4. Я понял. Не могли бы вы показать свой код внутри функции DayExecute()?

5. Я прошу ввести код ur, потому что я думаю, что вы также сможете выполнить свою операцию внутри onReceive.