Android 应用程序启动时服务启动不起作用?
Android Service Start is not working when app start?
我试图在每天的 8:30.am 设置一个重启应用程序的闹钟,所以我设计了服务和接收器,
<receiver android:name=".AlarmReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.SCREEN_ON" />
<action android:name="android.intent.action.SCREEN_OFF" />
</intent-filter>
</receiver>
AlarmReceiver.java
public class AlarmReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (Intent.ACTION_SCREEN_ON.equals(action)){ //not working ?
Log.d("BootReceiver", "screen on completed");
Intent Alarm = new Intent(context,LongRunningService.class); //start Service
context.startService(Alarm);
}
if (Intent.ACTION_BOOT_COMPLETED.equals(action)){ //not working ?
Log.d("BootReceiver", "system boot completed");
Intent Alarm = new Intent(context,LongRunningService.class); //start Service
context.startService(Alarm);
}
if ("startAlarm".equals(intent.getAction())){
Intent home = new Intent(context, MainActivity.class);
home.putExtra("RELOAD",1);
home.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(home);
}
LongRunningService.java
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable(){
@Override
public void run() {
Log.i(TAG, "run: executed at "+ new Date().toString()); //not working?
}
}).start();
AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
// Set the alarm to start at 8:30 a.m.
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 8);
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 00);
}
其实我是在MainActivity中启动服务的,但是我不想启动服务
onCrate in MainActivity , 因为我的闹钟设置 8:30 重启 MainActivity,
那将是问题,8:30:00 ~ 8:30:30 将重复重启我的应用....
根据docs
Apps that target Android 8.0 or higher can no longer register broadcast receivers for implicit broadcasts in their manifest. An implicit broadcast is a broadcast that does not target that app specifically
所以,如果你想接收这个广播,你需要在应用 运行 期间注册它们(只有当你的应用没有被销毁时它才会起作用)。
JobScheduler 我认为会更符合您的需求。
我试图在每天的 8:30.am 设置一个重启应用程序的闹钟,所以我设计了服务和接收器,
<receiver android:name=".AlarmReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.SCREEN_ON" />
<action android:name="android.intent.action.SCREEN_OFF" />
</intent-filter>
</receiver>
AlarmReceiver.java
public class AlarmReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (Intent.ACTION_SCREEN_ON.equals(action)){ //not working ?
Log.d("BootReceiver", "screen on completed");
Intent Alarm = new Intent(context,LongRunningService.class); //start Service
context.startService(Alarm);
}
if (Intent.ACTION_BOOT_COMPLETED.equals(action)){ //not working ?
Log.d("BootReceiver", "system boot completed");
Intent Alarm = new Intent(context,LongRunningService.class); //start Service
context.startService(Alarm);
}
if ("startAlarm".equals(intent.getAction())){
Intent home = new Intent(context, MainActivity.class);
home.putExtra("RELOAD",1);
home.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(home);
}
LongRunningService.java
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable(){
@Override
public void run() {
Log.i(TAG, "run: executed at "+ new Date().toString()); //not working?
}
}).start();
AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
// Set the alarm to start at 8:30 a.m.
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 8);
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 00);
}
其实我是在MainActivity中启动服务的,但是我不想启动服务
onCrate in MainActivity , 因为我的闹钟设置 8:30 重启 MainActivity,
那将是问题,8:30:00 ~ 8:30:30 将重复重启我的应用....
根据docs
Apps that target Android 8.0 or higher can no longer register broadcast receivers for implicit broadcasts in their manifest. An implicit broadcast is a broadcast that does not target that app specifically
所以,如果你想接收这个广播,你需要在应用 运行 期间注册它们(只有当你的应用没有被销毁时它才会起作用)。 JobScheduler 我认为会更符合您的需求。