当app重新关闭并关闭时Android杀死服务?

时间:2015-06-26 07:06:49

标签: android service kill

我必须在到达预定时间后在后台运行任务。我将我的服务唤醒到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();
    }

1 个答案:

答案 0 :(得分:1)

有许多方法可以避免杀死服务......但我们无法保证。在内存不足的情况下,服务将被操作系统杀死。在这种情况下,如果您返回START_STICKY,这将以null intent重新启动服务。如果您希望intent不为null,则返回START_REDELIVER_INTENT 请参阅android docs here