Android 我的闹钟服务只响了3秒钟

Android 我的闹钟服务只响了3秒钟,android,android-service,android-mediaplayer,android-pendingintent,Android,Android Service,Android Mediaplayer,Android Pendingintent,我使用报警管理器设置和报警,并在一天中使用该服务的准确时间发出 但它只运行mediaplayer 3秒并终止服务, 如果我在alarm song运行时滑动应用程序,服务将终止 //当我用时间选择器而不是自己设置时间时,闹钟会立即响3秒钟,然后停止,在我用时间选择器选择的确切时间内,闹钟工作正常 <manifest <uses-permission android:name="android.permission.WAKE_LOCK" /> <service

我使用报警管理器设置和报警,并在一天中使用该服务的准确时间发出 但它只运行mediaplayer 3秒并终止服务, 如果我在alarm song运行时滑动应用程序,服务将终止

//当我用时间选择器而不是自己设置时间时,闹钟会立即响3秒钟,然后停止,在我用时间选择器选择的确切时间内,闹钟工作正常

<manifest

 <uses-permission android:name="android.permission.WAKE_LOCK" />
 <service
            android:name=".Service"
            android:exported="false" />
主要活动

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

 Calendar calendar = Calendar.getInstance();

            calendar.set(Calendar.YEAR, 2018);
            calendar.set(Calendar.MONTH, 2);
            calendar.set(Calendar.DAY_OF_MONTH, 24);
            calendar.set(Calendar.HOUR_OF_DAY, 1);
            calendar.set(Calendar.MINUTE, 4);
            calendar.set(Calendar.SECOND, 0);

        setAlarm(calendar.getTimeInMillis());
}
 private void setAlarm(long time) {

        Intent i = new Intent(this, Service.class);

        PendingIntent pendingIntent = PendingIntent.getService(this, 0, i, 0);

        AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        int ALARM_TYPE = AlarmManager.RTC_WAKEUP;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            am.setExactAndAllowWhileIdle(ALARM_TYPE, time, pendingIntent);
        else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
            am.setExact(ALARM_TYPE, time, pendingIntent);
        else
            am.set(ALARM_TYPE, time, pendingIntent);

        Toast.makeText(this, "Alarm is set", Toast.LENGTH_SHORT).show();
    }
}

您应该使用
onStart()
方法中的
startForeground(,)
将服务作为前台服务启动。然后它将具有更高的优先级,并且不太可能被杀死。看

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

 Calendar calendar = Calendar.getInstance();

            calendar.set(Calendar.YEAR, 2018);
            calendar.set(Calendar.MONTH, 2);
            calendar.set(Calendar.DAY_OF_MONTH, 24);
            calendar.set(Calendar.HOUR_OF_DAY, 1);
            calendar.set(Calendar.MINUTE, 4);
            calendar.set(Calendar.SECOND, 0);

        setAlarm(calendar.getTimeInMillis());
}
 private void setAlarm(long time) {

        Intent i = new Intent(this, Service.class);

        PendingIntent pendingIntent = PendingIntent.getService(this, 0, i, 0);

        AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        int ALARM_TYPE = AlarmManager.RTC_WAKEUP;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            am.setExactAndAllowWhileIdle(ALARM_TYPE, time, pendingIntent);
        else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
            am.setExact(ALARM_TYPE, time, pendingIntent);
        else
            am.set(ALARM_TYPE, time, pendingIntent);

        Toast.makeText(this, "Alarm is set", Toast.LENGTH_SHORT).show();
    }
}