Is there a way to keep a repeating alarm working after existing the app that uses a broadcast receiver?

僤鯓⒐⒋嵵緔 提交于 2019-12-11 05:29:31

问题


I am new on Android. I am trying to create an application that uses BroadcastReceiver to execute a function on the main activity triggered by a repeating alarm. I read that I had to dynamically register the broadcastReceiver which I did - this is to be able to execute the function on the main activity. The problem I am faced with is that as soon as the app is exited, the alarm stops working. I read that this is by design - is there a way to overcome this or do I have to use a service? Thanks in advance.

Sample code:

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:


I think, the reason why your alarm stops working when your app isn't running is that you're registering your AlarmReceiver locally with registerReceiver. If you want to register your AlarmReceiver so that it keeps working even when your app isn't running, you need to register it inside AndroidManifest.xml.

Firstly, add your reciever into AndroidManifest.xml like this:

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

And set your alarm like this (Remember: Don't set alarm interval too short, set at least 1 minute; you set ur interval 1,5 second in ur code - it may not work):

    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);

And just do what you want to do when alarm triggers inside 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...
                 }
         }


来源:https://stackoverflow.com/questions/40060029/is-there-a-way-to-keep-a-repeating-alarm-working-after-existing-the-app-that-use

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!