我一直在搜索,但我仍然无法找到解决方案
我在onStartCommand中有一个返回Start_Sticky的服务,它将在onDestroy服务方法中启动。我虽然这已经足够了,因为我的服务将被用户停止,因此将调用onDestroy方法。或者由android停止,然后由于Start_Sticky,android会在杀死它之后重新创建它,但是android在杀死之后不会启动我的服务。
所以我使用AlarmManager类来注册一个广播接收器,然后在onReceive方法中启动我的服务,但似乎在手机进入睡眠模式后,onReceive方法不会再被调用。我甚至尝试过使用wakeLock
无论如何,问题是如何使服务始终运行或在停止后重新创建,如电报或Instagram服务
这是我的服务:
public final class MyService extends Service {
@Override
public void onCreate() {
super.onCreate();
//some stuff
AlarmManager am = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
Intent ii = new Intent(getApplicationContext(), MyReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 12345, ii, 0);
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.KITKAT)
am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1 * 60 * 1000, pi);
else
am.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1*60*1000, pi);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
return START_STICKY;
}
@Override
public synchronized void onDestroy() {
startService(new Intent(ACTION_MAIN).setClass(context, MyService.class));
super.onDestroy();
}
}
这是我的接收者:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
//WakeLocker.acquire(context);
context.startService(new Intent(ACTION_MAIN).setClass(context, MyService.class));
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
AlarmManager am2 =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, MyReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 12345, i, 0);
am2.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1*60*1000, pi);
}
else
{
AlarmManager am2 =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, MyReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 12345, i, 0);
am2.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1*60*1000, pi);
}
}
}
编辑: 好的,我有一个更简单的问题 为什么这个简单的服务在android杀死之后不会重新创建? 我在活动中使用startService启动服务但是大约20分钟后我的服务在运行的任务中消失了......为什么会这样?
public class NotificationsService extends Service {
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
public void onDestroy() {
super.onDestroy();
}
}
答案 0 :(得分:0)
android中的任何服务都无法无限期地(PERSISTENT)接受系统服务。
你只能让服务返回START_STICKY。获取唤醒锁定不是一个好主意,因为它会耗尽用户电池。
即使服务被终止,它也会被系统重新启动。
您可以实现BOOT_COMPLETED接收器,以便在设备启动时启动服务。