需要一个Android服务来运行

时间:2015-11-09 20:49:25

标签: android service

我一直在搜索,但我仍然无法找到解决方案

我在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();
    }
}

1 个答案:

答案 0 :(得分:0)

android中的任何服务都无法无限期地(PERSISTENT)接受系统服务。

你只能让服务返回START_STICKY。获取唤醒锁定不是一个好主意,因为它会耗尽用户电池。

即使服务被终止,它也会被系统重新启动。

您可以实现BOOT_COMPLETED接收器,以便在设备启动时启动服务。