我正在编写一个不时弹出通知的应用程序。 服务正在后台运行,当我杀死应用程序时,服务重新启动并弹出通知,但我不希望这种情况发生。
我希望服务能够保持安静并在正确的时间执行。(我正在使用TimerTask)
我不想杀死或重启服务,我希望它能在那里安静下来。
答案 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();
}
}
}
啤酒花这可能会有所帮助。 对不起代码格式不正确....