如何从堆栈中删除应用程序时保持服务处于活动状态



我想使用警报管理器每分钟显示一次通知,我已经实现了以下代码,它工作正常,但问题是当我从堆栈中删除应用程序时,服务没有运行。

我想保持活力,我已经尝试过onStartCommand中START_STICKY并且也使用过onTaskRemoved,但它是一样的。

我也尝试使用WakefulIntentService实现,但问题是相同的。我的代码如下。

在主活动中

Intent myIntent = new Intent(NotificationDemo.this, MyReceiver.class);
myIntent.putExtra("title", "2 minutes");
Random random = new Random();
int m = random.nextInt(9999 - 1000) + 1000;
Log.d("m::: In Notification", m + "");
myIntent.putExtra("id", m);
pendingIntent = PendingIntent.getBroadcast(NotificationDemo.this, m, myIntent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
//                alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis(),alarmManager.Inte pendingIntent);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime(),
1 * 60 * 1000,
pendingIntent);

我的服务

public class MyAlarmService extends Service {
private NotificationManager mManager;
@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) {
String title = intent.getStringExtra("title");
int id = intent.getIntExtra("id", 0);
mManager = (NotificationManager) this.getApplicationContext().getSystemService(this.getApplicationContext().NOTIFICATION_SERVICE);
Intent intent1 = new Intent(this.getApplicationContext(), MainActivity.class);
Notification notification = new Notification(R.mipmap.ic_launcher, title, System.currentTimeMillis());
intent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
Log.d("id::", id + "");
PendingIntent pendingNotificationIntent = PendingIntent.getActivity(this.getApplicationContext(), id, intent1, PendingIntent.FLAG_UPDATE_CURRENT);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
//        notification.setLatestEventInfo(this.getApplicationContext(), "AlarmManagerDemo", "This is a test message!", pendingNotificationIntent);
NotificationCompat.Builder builder = new NotificationCompat.Builder(MyAlarmService.this);
notification = builder.setContentTitle(title)
.setContentText("Hellooo...")
.setTicker("Good Evening...")
.setSmallIcon(android.R.drawable.ic_btn_speak_now)
.setVibrate(new long[]{1000, 1000, 1000, 100})
.setLights(5, 5, 5)
.setContentIntent(pendingNotificationIntent).build();
mManager.notify(id, notification);
startForeground(1337, notification);
return START_STICKY;
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
// sendBroadcast(new Intent("IWillStartAuto"));
}
@Override
public void onTaskRemoved(Intent rootIntent) {
super.onTaskRemoved(rootIntent);
//        sendBroadcast(new Intent("IWillStartAuto"));
//        Intent intent = new Intent(getApplicationContext(),MyReceiver.class);
//        sendBroadcast(intent);
}
}

这是我的接收器

public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String title = intent.getStringExtra("title");
int id = intent.getIntExtra("id", 0);
Intent service1 = new Intent(context, MyAlarmService.class);
service1.putExtra("title", title);
service1.putExtra("id", id);
context.startService(service1);
}
}

在清单中

<receiver android:name=".MyReceiver">
<!--<intent-filter>
<action android:name="IWillStartAuto"/>
</intent-filter>-->
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service
android:name=".MyAlarmService"
android:enabled="true"
android:stopWithTask="false" />

您需要在前台启动服务。
您在服务 OnCreate(( 方法中缺少此内容。

startForeground(1337, notification);
return START_STICKY;

并且不要在 Destroy(( 方法的活动或片段中停止您的服务。

我在手机上用 android 6.0 和在模拟器上都测试了这段代码,两者都工作正常,甚至从堆栈中删除了应用程序。
即使删除接收器代码,通知仍然有效。

您可以尝试使用接收器配置进程=":远程"来保持接收器活动状态。我遇到了这个问题,这是我的解决方案。

您是否尝试过使用任何其他输出语句的代码?通知,迟到,也没有为我触发 - 我可能会责怪即时运行,但是你能尝试用类似 Toast 的东西替换通知触发代码片段吗?由于 Toasts 在服务中不起作用,也许您可以在服务开始知道它可能已启动并运行时尝试在外部存储目录中创建一个文件?

最新更新