我想将项目中的BroadcastReceiver替换为GcmNetworkManager。因此,我阅读了一些教程,并像这样做:
1)我在清单中添加:
<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)服务:
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)在活动中安排:
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服务的最佳实践是什么,就像在广播接收器中一样?
发布于 2016-10-12 20:19:36
您不应该在onStartCommand中运行代码。
相反,请使用onRunTask。
@Override
public int onRunTask(TaskParams taskParams) {
Toast.makeText(this,"Выполнилось",Toast.LENGTH_SHORT).show();
return GcmNetworkManager.RESULT_SUCCESS;
}当调度程序启动您的服务时,将创建一个新线程,系统将调用onRunTask()。通过重写onRunTask()来实现任务的逻辑;
至于在建立到因特网的连接时运行该任务。最好不要这样做,除非你真的需要这样做。这就是这个任务的意义所在。安排您的任务与其他任务一起工作。如果您确实需要在建立internet连接时触发它,则需要使用BroadcastReceiver并手动运行代码。您不能在任意时间触发此任务。
发布于 2021-05-26 09:44:29
对于那些对此有疑问的人,可以考虑迁移到WorkManager:
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
https://stackoverflow.com/questions/39998368
复制相似问题