所以我试图让 AlarmManager 每 60 秒运行一次,它将向服务器运行 http 请求。我希望该服务在应用程序打开时运行,并且在屏幕关闭( sleep )时仍然运行。
如果用户在最近的应用程序菜单下将应用程序滑开,我希望该服务停止/取消。
Service.onDestroy
方法的运行时间仅为看上去的一半,而 Alarm.onReceive
方法将永远运行(每 60 秒一次),即使应用程序已关闭。
调用 Alarm.cancelAlarm
不会发生任何更改。
我错过了什么?
AndroidManifest:
<receiver android:process=":remote" android:name=".objects.Alarm"></receiver>
<service
android:name=".objects.Service"
android:enabled="true"
android:process=":your_service"
android:stopWithTask="true">
</service>
主要 Activity :
@Override
protected void onCreate(Bundle savedInstanceState) {
startService(new Intent(LaunchActivity.this, Service.class));
}
服务:
public class Service extends android.app.Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
alarm.setAlarm(this);
return START_NOT_STICKY;
}
@Override
public void onDestroy(){
alarm.cancelAlarm(this);
}
}
广播接收器:
public class Alarm extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Log.d("mytag","trigger update");
}
public void setAlarm(Context context)
{
AlarmManager am =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, Alarm.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
am.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), 60000, pi);
}
public void cancelAlarm(Context context)
{
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent myIntent = new Intent(context, Alarm.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
context, 0, myIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
am.cancel(pendingIntent);
}
}
最佳答案
您正在创建一个在单独线程上运行的接收器服务。删除 android:process="XX"并使用 START_STICKY。
如果您使用 JobService 而不是 Service/Receiver 组合,事情会更简单。
尝试这样的事情:
<service android:name=".services.AlarmService">
<intent-filter>
<action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
</intent-filter>
</service>
--
AlarmService.schedule(this,XXXX);
--
public class AlarmService extends JobService {
private static String TAG = "AlarmService";
public static void schedule(Context context, int minutes) {
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));
Job myJob = dispatcher.newJobBuilder()
.setService(SubscriptionAlarmService.class) // the JobService that will be called
.setTag(TAG) // uniquely identifies the job
.setRecurring(true)
.setReplaceCurrent(true)
.setTrigger(Trigger.executionWindow(minutes * 60,(minutes * 60) + 10))
.setLifetime(Lifetime.UNTIL_NEXT_BOOT)
.setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
.setConstraints(Constraint.ON_ANY_NETWORK)
.build();
dispatcher.mustSchedule(myJob);
}
public static void CancelAlarm(Context context) {
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));
dispatcher.cancel(TAG);
}
public void run() {
//DO STUFF HERE
}
@Override
public boolean onStartJob(JobParameters job) {
run();
return false;
}
@Override
public boolean onStopJob(JobParameters job) {
return false;
}
}
关于java - 当用户关闭应用程序时服务不会停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51617756/