应用程序未打开时,每天运行代码

时间:2015-08-28 16:11:17

标签: android

我想每天(每24小时)运行一些代码。问题是如果用户没有打开应用程序。如何在应用程序未打开时运行代码?

2 个答案:

答案 0 :(得分:11)

在android中运行后台定期任务,您可以使用各种方式,其中一些是:

  1. JobScheduler(仅适用于API 21或更高版本)
  2. Android在API 21上添加了此类文档,这里的文档是link

    1. JobSchedulerCompat - 用于API 11或更高版本的JobScheduler库的Backport
    2. 您可以找到有关库here的所有内容。

      1. 使用警报管理器处理定期任务
      2. 您还可以使用AlarmManager来安排定期任务。有关实施它的完整文章已发布here

        1. 使用GCM(Google云消息传递)网络管理器安排定期任务。
        2. 您可以查看此文档link来实现它。

          使用GCM网络管理器定期执行任务的示例

          在项目级build.gradle中添加依赖项。

          compile 'com.google.android.gms:play-services-gcm:7.5.0'
          

          创建一个扩展到GcmTaskService

          的java类
          public class BackgroundTaskHandler extends GcmTaskService {
          
              public BackgroundTaskHandler() {
              }
          
              @Override
              public int onRunTask(TaskParams taskParams) {
                   //Your periodic code here
              }
          }
          

          在manifest.xml中声明服务

              <service
                  android:name=".BackgroundTaskHandler"
                  android:exported="true"
                  android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE">
                  <intent-filter>
                      <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY" />
                  </intent-filter>
              </service>
          

          现在从任何类安排定期任务: -

              String tag = "periodic";
          
              GcmNetworkManager mScheduler = GcmNetworkManager.getInstance(getApplicationContext());
          
              long periodSecs = 60L;// 1 minute
          
              PeriodicTask periodic = new PeriodicTask.Builder()
                      .setService(BackgroundTaskHandler.class)
                      .setPeriod(periodSecs)
                      .setTag(tag)
                      .setPersisted(true)
                      .setUpdateCurrent(true).setRequiredNetwork(com.google.android.gms.gcm.Task.NETWORK_STATE_CONNECTED)
                      .build();
              mScheduler.schedule(periodic);
          

答案 1 :(得分:1)

实施预定运营的全新方式是使用job scheduler,可从sdk级别21获得。

最近向谷歌播放服务添加了一种更简单(并且后向移植)的执行定期任务的方式(不是这样):network manager。尽管名称如此,但安排非网络相关任务非常有用。

检查

  

无论网络和设备充电状态如何,都要安排定期任务

部分。