首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GcmTaskService不工作

GcmTaskService不工作
EN

Stack Overflow用户
提问于 2016-10-12 20:15:26
回答 2查看 920关注 0票数 0

我想将项目中的BroadcastReceiver替换为GcmNetworkManager。因此,我阅读了一些教程,并像这样做:

1)我在清单中添加:

代码语言:javascript
复制
<service android:name=".WakeOnLanService"
      android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE"
        android:exported="true">
        <intent-filter>
            <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY"/>
        </intent-filter>
    </service>  

2)服务:

代码语言:javascript
复制
public class WakeOnLanService extends GcmTaskService {

@Override
public int onRunTask(TaskParams taskParams) {
    return GcmNetworkManager.RESULT_SUCCESS;
}

@Override
public int onStartCommand(Intent intent, int i, int i1) {
    Toast.makeText(this,"Выполнилось",Toast.LENGTH_SHORT).show();
    return super.onStartCommand(intent, i, i1);
}
}

3)在活动中安排:

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    GcmNetworkManager mGcmNetworkManager = GcmNetworkManager.getInstance(this);
    Task task = new OneoffTask.Builder()
            .setService(WakeOnLanService.class)
            .setExecutionWindow(0, 2)
            .setTag("MyTag")
            .setUpdateCurrent(true)
            .setRequiredNetwork(Task.NETWORK_STATE_CONNECTED)
            .setRequiresCharging(false)
            .build();
    mGcmNetworkManager.schedule(task);
}
}

但这不是工作,吐司没有显示。如何正确操作?在internet连接上运行GcmNetworkManager服务的最佳实践是什么,就像在广播接收器中一样?

EN

回答 2

Stack Overflow用户

发布于 2016-10-12 20:19:36

您不应该在onStartCommand中运行代码。

相反,请使用onRunTask

代码语言:javascript
复制
@Override
public int onRunTask(TaskParams taskParams) {
    Toast.makeText(this,"Выполнилось",Toast.LENGTH_SHORT).show();
    return GcmNetworkManager.RESULT_SUCCESS;
}

documentation

当调度程序启动您的服务时,将创建一个新线程,系统将调用onRunTask()。通过重写onRunTask()来实现任务的逻辑;

至于在建立到因特网的连接时运行该任务。最好不要这样做,除非你真的需要这样做。这就是这个任务的意义所在。安排您的任务与其他任务一起工作。如果您确实需要在建立internet连接时触发它,则需要使用BroadcastReceiver并手动运行代码。您不能在任意时间触发此任务。

票数 2
EN

Stack Overflow用户

发布于 2021-05-26 09:44:29

对于那些对此有疑问的人,可以考虑迁移到WorkManager:

代码语言:javascript
复制
public class UploadWorker extends Worker {

    public UploadWorker(
        @NonNull Context context,
        @NonNull WorkerParameters params) {
        super(context, params);
    }

    @Override
    public Result doWork() {
      // Do the upload operation ...

      myUploadOperation()

      // Indicate whether the task finished successfully with the Result
      return Result.success()
    }
}


Constraints uploadConstraints = new Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .setRequiresCharging(true)
    .build();

OneTimeWorkRequest uploadTask =
        new OneTimeWorkRequest.Builder(UploadWorker.class)
  .setConstraints(uploadConstraints)
  .build();
WorkManager.getInstance().enqueue(uploadTask);

参考资料:

https://developer.android.com/topic/libraries/architecture/workmanager/migrating-gcm

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39998368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档