我必须在到达预定时间后在后台运行任务。我将我的服务唤醒到Alarm Manager
分配了任务,如果应用程序是后台/正在运行,它会很好。服务在应用程序上保持良好运行状态#39; s背景以及前景状态,如果在开始服务后没有改变app的状态,以便很好地理解下面给出的场景。
案例1:
1.设置计划并将时间发送给警报管理器并保持应用程序正常运行。
2.Alarm管理员在到达时调用服务。
3.服务开始运行
4.当我关闭我的应用服务时停止
案例2:
1.设置时间表并将时间发送给警报管理器并在后台关闭app.now应用程序。
2.Alarm管理员在到达时调用服务。
3.服务开始运行
4.Relaun the app.service继续运行/正常工作。
5.现在关闭应用程序,结果是服务已经死亡。
我必须仅通过Alarm Manager
来调用该服务,而不是每当应用程序在服务onStartCommand
方法中为此目的启动时,我都返回START_NOT_STICKY
并且我不想要使用START_STICKY
。如果我转到START_STICKY
,它就不会考虑预定的时间。事情是我不想再次检查时间了由Alarm Manager
做得很好。
当app在低内存上运行时,服务会被破坏。使用startForeground而不是startService的解决方案是什么?
如何在不打扰应用程序开启/关闭状态的情况下让我的服务稳定运行?
设定时间表
public void setAction(View v) {
Calendar calendar = Calendar.getInstance();
int hour = Integer.parseInt(HH.getText().toString());
int minute = Integer.parseInt(MM.getText().toString());
int second = Integer.parseInt(SS.getText().toString());
String peried = PP.getText().toString();
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, second);
calendar.set(Calendar.AM_PM, peried.equalsIgnoreCase("AM") ? Calendar.AM : Calendar.PM);
Intent myIntent = new Intent(MainActivity.this, MyReceiver.class);
myIntent.putExtra(ACTION,
ACTION_SC_1);
pendingIntent = PendingIntent.getBroadcast(MainActivity.this, REQUEST_CODE_SC_1, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);
}
服务类
public class MyService extends Service {
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
try {
final String action = intent.getStringExtra(ACTION);
final Handler handler = new Handler();
final Timer timer = new Timer();
final TimerTask doAsynchronousTask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
try {
Toast.makeText(MyAlarmService.this, "Running....", Toast.LENGTH_LONG).show();
} catch (Exception e) {
// TODO Auto-generated catch block
}
}
});
}
};
timer.schedule(doAsynchronousTask, 1000, 5000); //execute in every 5000 msdo
// this.stopSelf();
} catch (Exception e) {
//TODO
}
return START_NOT_STICKY;
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Toast.makeText(this, "Killed", Toast.LENGTH_LONG).show();
}
答案 0 :(得分:1)
有许多方法可以避免杀死服务......但我们无法保证。在内存不足的情况下,服务将被操作系统杀死。在这种情况下,如果您返回START_STICKY
,这将以null intent重新启动服务。如果您希望intent不为null,则返回START_REDELIVER_INTENT
请参阅android docs here