OnDestroy重新启动服务,如何在不杀死或重新启动服务的情况下销毁我的活动?

时间:2016-02-23 12:35:56

标签: android service timertask

我正在编写一个不时弹出通知的应用程序。 服务正在后台运行,当我杀死应用程序时,服务重新启动并弹出通知,但我不希望这种情况发生。

我希望服务能够保持安静并在正确的时间执行。(我正在使用TimerTask)

我不想杀死或重启服务,我希望它能在那里安静下来。

2 个答案:

答案 0 :(得分:4)

  

当我杀死应用程序时,服务重新启动并弹出通知,但我不希望这种情况发生

在您的服务的onStartCommand()方法中,返回START_NOT_STICKY

(我所以希望这是默认...)

  

我希望服务能够保持安静并在正确的时间执行。(我使用的是TimerTask)

使用AlarmManager安排在正确的时间执行;不要在正在运行的服务中使用TimerTask。仅在actively delivering value to the user时运行服务。观察时钟标记并不能主动为用户提供价值。

答案 1 :(得分:0)

我遇到了同样的问题,在阅读完文档,堆栈溢出和博客文章后解决了问题。我创建了一个后台服务并使其成为前台,以防止它在应用程序(进程)关闭或打开时重新启动 - 以防止数据从服务中丢失。但同样,有持续的通知产生了不可动摇的(我讨厌它)。我想删除此通知以及服务已启动。然后开始冲浪更新通知,在那里我发现一个问题,指示我更新通知的文档。我阅读并更新了前台服务通知,并且它像魅力一样工作。我在这里给出了完整的代码。

主要活动

public class MainActivity extends AppCompatActivity {

TextView textView;
Context context = this;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    textView = (TextView) findViewById(R.id.time);

    Intent background = new Intent(context,TimeBroadCast.class);
    context.startService(background);

    LocalBroadcastManager.getInstance(this).registerReceiver(
            new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    int message = intent.getIntExtra(UpdatTime.timUpdate,0);
                    textView.setText(String.valueOf(message));
                }
            }, new IntentFilter(UpdatTime.ACTION_LOCATION_BROADCAST)
    );
}


}

服务类

public class TimeBroadCast extends Service {
private boolean isRunning;
private Context context;
UpdatTime updatTime;
Timer timer;
@Override
public void onCreate() {
    this.context = this;
    this.isRunning = false;
    timer = new Timer();
    updatTime = new UpdatTime(this);
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    StartForground();
    Notification notification = new NotificationCompat.Builder(this).build();
    String ns = Context.NOTIFICATION_SERVICE;
    NotificationManager nMgr = (NotificationManager) getApplicationContext().getSystemService(ns);
    nMgr.notify(101,notification);
    nMgr.cancel(101);
    return START_STICKY;
}

@Override
public void onDestroy() {

    StopForgroudn();
    super.onDestroy();
}

private void StartForground() {
    if(!isRunning) {

        isRunning = true;
        timer.schedule(updatTime, 0, 1000);
    }

    Notification notification = new NotificationCompat.Builder(this)
            .setOngoing(false)
            .setSmallIcon(android.R.color.transparent)
            .build();
    startForeground(101,  notification);



}

 private  void StopForgroudn()
{
 timer.cancel();  // Terminates this timer, discarding any currently                      scheduled tasks.
timer.purge();   // Removes all cancelled tasks from this timer's task queue.
stopForeground(true);
stopSelf();
  }

}

TimerTaks类

public class UpdatTime extends TimerTask {

static String timUpdate = "timecountdown", ACTION_LOCATION_BROADCAST = TimeBroadCast.class.getName() + "TimeBroadCast";
Context myContext;
int i = 0;
public UpdatTime(Context myContext) {
    this.myContext = myContext;
}

@Override
public synchronized void run() {



    try {

        i += 1;
        Log.v("Data1", ""+i);
        Intent intent = new Intent(ACTION_LOCATION_BROADCAST);
        intent.putExtra(timUpdate,i);
        LocalBroadcastManager.getInstance(myContext).sendBroadcast(intent);

    } catch (Exception e) {
        e.printStackTrace();
    }


}
}

啤酒花这可能会有所帮助。 对不起代码格式不正确....