清除缓存会停止android服务/待定意图

时间:2016-12-26 02:37:15

标签: android android-service

我正在使用意向服务。每当我清除缓存(通过单击最近任务按钮然后单击清除缓存图标)我的服务关闭(如果启动),即使我使用警报管理器设置的待处理意图如果计划稍后启动也不会启动该服务。

这是我的基本代码:

public class MainActivity extends Activity {
    SampleAlarmReceiver alarm = new SampleAlarmReceiver();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        alarm.setAlarm(this);
    }
}


public class SampleAlarmReceiver extends WakefulBroadcastReceiver {
    private AlarmManager alarmMgr;
    private PendingIntent alarmIntent;

    @Override
    public void onReceive(Context context, Intent intent) {   

        Intent service = new Intent(context, SampleSchedulingService.class);
        startWakefulService(context, service);
    }

    public void setAlarm(Context context) {
        alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, SampleAlarmReceiver.class);
        alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, 8);
        calendar.set(Calendar.MINUTE, 30);

        alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP,  
                calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent);

        ComponentName receiver = new ComponentName(context, SampleBootReceiver.class);
        PackageManager pm = context.getPackageManager();

        pm.setComponentEnabledSetting(receiver,
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP);           
    }
    public void cancelAlarm(Context context) {
        if (alarmMgr!= null) {
            alarmMgr.cancel(alarmIntent);
        }
        ComponentName receiver = new ComponentName(context, SampleBootReceiver.class);
        PackageManager pm = context.getPackageManager();

        pm.setComponentEnabledSetting(receiver,
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);
    }
}




public class SampleBootReceiver extends BroadcastReceiver {

    SampleAlarmReceiver alarm = new SampleAlarmReceiver();

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED"))
        {
            alarm.setAlarm(context);
        }
    }
}



public class SampleSchedulingService extends IntentService {
    public SampleSchedulingService() {
        super("SchedulingService");
    }

    public static final String TAG = "Scheduling Demo";
    public static final int NOTIFICATION_ID = 1;
    private NotificationManager mNotificationManager;
    NotificationCompat.Builder builder;

    @Override
    protected void onHandleIntent(Intent intent) {
        //my work
        SampleAlarmReceiver.completeWakefulIntent(intent);
    }

}

大部分内容来自以下示例代码: https://developer.android.com/training/scheduling/alarms.html

如何在清除缓存后保持服务正常运行或重新启动。此外,即使在清除缓存后,如何确保挂起的意图也将启动服务。

由于 感谢帮助:)

1 个答案:

答案 0 :(得分:0)

这是清除Android应用程序的缓存或数据时的预期行为。

清除应用程序数据后, Android操作系统会关闭应用程序(如果正在运行)并清除与该应用程序关联的所有服务和广播接收器。甚至警报管理员也被清除。

为什么会这样?您可以看到,服务和接收器利用应用程序数据执行多项操作。因此,如果您的服务没有关闭清除数据,它可能会在运行时引发几个异常,因为它运行的数据根本就不存在了!

目前还没有解决方案。 您可以执行的是在应用启动时重新启动服务和接收器。

如果要清除应用缓存或数据,还请在评论中提及?您可以参考此question了解更多信息。