代码之家  ›  专栏  ›  技术社区  ›  SilverNak jach

AlarmManager在Oreo及更高版本中关闭应用程序时触发

  •  0
  • SilverNak jach  · 技术社区  · 6 年前

    使用时 AlarmManager PendingIntent s与 Service 被处死的人和被处死的人一样 BroadcastReceiver s、 在android8(Oreo)和更高版本中,只有BroadcastReceivers在应用程序关闭时才执行。

    举个例子:

    活动

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            long currentTimeMillis = System.currentTimeMillis();
            for (long i = currentTimeMillis; i < currentTimeMillis + 60000; i += 10000) {
                Intent serviceIntent = new Intent(getApplicationContext(), TestService.class);
                PendingIntent servicePendingIntent = PendingIntent.getService(getApplicationContext(), (int) i, serviceIntent, PendingIntent.FLAG_ONE_SHOT);
    
                Intent receiverIntent = new Intent(getApplicationContext(), TestReceiver.class);
                PendingIntent receiverPendingIntent = PendingIntent.getBroadcast(getApplicationContext(), (int) i, receiverIntent, PendingIntent.FLAG_ONE_SHOT);
    
                AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
                alarmManager.set(AlarmManager.RTC_WAKEUP, i, servicePendingIntent);
                alarmManager.set(AlarmManager.RTC_WAKEUP, i, receiverPendingIntent);
            }
        }
    }
    

    服务

    public class TestService extends IntentService {
        public TestService() {
            super("TestService");
        }
    
        @Override
        protected void onHandleIntent(@Nullable Intent intent) {
            System.out.println("Service");
        }
    }
    

    接收器

    public class TestReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            System.out.println("Receiver");
        }
    }
    

    <service android:name=".TestService" />
    <receiver android:name=".TestReceiver" />
    

    I/System.out: Receiver
    I/System.out: Service
    I/System.out: Receiver
    I/System.out: Service
    I/System.out: Receiver
    I/System.out: Service
    *App closed here*
    I/System.out: Receiver
    I/System.out: Service
    I/System.out: Service
    I/System.out: Receiver
    I/System.out: Receiver
    I/System.out: Service
    

    而在奥利奥,这种情况会发生:

    I/System.out: Service
    I/System.out: Receiver
    I/System.out: Service
    I/System.out: Receiver
    *App closed here*
    I/System.out: Receiver
    I/System.out: Receiver
    I/System.out: Receiver
    I/System.out: Receiver
    

    为什么会这样 全局定时器 使用 服务 他在奥利奥的表现和以前不一样吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   lionscribe    6 年前

    Android Oreo限制了创建后台服务的能力。看到了吗 here 更多信息。您必须使用JobIntentService或类似的工具对其进行编码。