Search code examples
androidservicebroadcastreceiveralarmmanager

Android Service Start is not working when app start?


I am try to set a alarm to restart app on 8:30.am in every day , so I design service and receiver,

     <receiver android:name=".AlarmReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.SCREEN_ON" />
            <action android:name="android.intent.action.SCREEN_OFF" />
        </intent-filter>
    </receiver>

AlarmReceiver.java

    public class AlarmReceiver extends BroadcastReceiver{
       public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (Intent.ACTION_SCREEN_ON.equals(action)){  //not working ?
          Log.d("BootReceiver", "screen on completed");
          Intent Alarm = new Intent(context,LongRunningService.class);  //start Service
          context.startService(Alarm);
       }

       if (Intent.ACTION_BOOT_COMPLETED.equals(action)){ //not working ?
        Log.d("BootReceiver", "system boot completed");
        Intent Alarm = new Intent(context,LongRunningService.class); //start Service
        context.startService(Alarm);
       }

       if ("startAlarm".equals(intent.getAction())){
        Intent home = new Intent(context, MainActivity.class);
        home.putExtra("RELOAD",1);
        home.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(home);
    }

LongRunningService.java

    public int onStartCommand(Intent intent, int flags, int startId) {
    new Thread(new Runnable(){

        @Override
        public void run() {
            Log.i(TAG, "run: executed at "+ new Date().toString()); //not working?
        }
    }).start();

    AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);

    // Set the alarm to start at 8:30 a.m.
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, 8);   
    calendar.set(Calendar.MINUTE, 30);     
    calendar.set(Calendar.SECOND, 00);   

  }

In fact , I start service in MainActivity , but I don't want to start service

onCrate in MainActivity , because My alarm set 8:30 to restart MainActivity,

that will be problem , 8:30:00 ~ 8:30:30 will repeat restart my app....


Solution

  • According to docs

    Apps that target Android 8.0 or higher can no longer register broadcast receivers for implicit broadcasts in their manifest. An implicit broadcast is a broadcast that does not target that app specifically

    So, if you want receive this broadcast you need to register them during app run (and it will work only if you app not destroyed). JobScheduler will better fit your needs, i think.