java - 当用户关闭应用程序时服务不会停止

标签 java android android-service alarmmanager

所以我试图让 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/

相关文章:

java - Spring Boot不渲染JSP View

android - 从 Android java 应用程序创建符号链接(symbolic link)

java - 每次我声明并运行两个服务时获取 java.lang.ClassCastException : android. os.BinderProxy

ProcessBuilder 调用的 Java 进程永远 hibernate

java - 小于运算符也评估相等值

java - Hibernate - 枚举与整数

android - Android 2.2.3 Gradle同步问题

java - android.database.CursorIndexOutOfBoundsException : Index -1 requested, 大小为 22

android - 锁定和解锁屏幕后恢复 fragment

安卓:意向服务。在哪里保存文件?