首页 文章

需要一个Android服务来运行

提问于
浏览
1

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

我在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

    android中的服务无法无限期地(PERSISTENT)接受系统服务 .

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

    即使服务被杀死,它也会被系统重新启动 .

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

相关问题