gpt4 book ai didi

android - BroacastReceiver 在设备休眠时不工作?

转载 作者:行者123 更新时间:2023-11-29 01:07:59 24 4
gpt4 key购买 nike

我正在编写一个应用程序来跟踪 Google map 上的路线历史记录。它会每 5 分钟获取一次设备的当前位置,并通过网络服务将数据发送到服务器。

此代码用于从 MainActivity 调用 BroadcastReceiver

manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
intent.putExtra("USERNAME", mUsername);
intent.putExtra("DB_NAME", mDBName);
intent.putExtra("DB_IP", mDBIP);
intent.putExtra("DB_USER", mDBUsername);
intent.putExtra("DB_PASS", mDBPassword);
intent.putExtra("SERVER_IP", mServerIP);

mAlarmIntent = PendingIntent.getActivity(getApplicationContext(), REQUEST_CODE, intent, 0);
int mTimeRepeat = 300 * 1000; // repeat every 5 minutes
int mTimeStart = 5 * 1000;

manager.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + mTimeStart, mTimeRepeat, mAlarmIntent);

在 BroadcastReceiver 中,我获取经纬度并调用网络服务。

public class AlarmReceiver extends BroadcastReceiver {
private static final String TAG = "Alarm Receiver";

private String mUsername = "";
private String mDBName = "";
private String mDBIP = "";
private String mDBUsername = "";
private String mDBPassword = "";
private String mServerIP = "";

private Context context;
private static AsyncHttpClient sClient = new AsyncHttpClient();

@Override
public void onReceive(final Context context, Intent intent) {
this.context = context;

mUsername = intent.getStringExtra("USERNAME");
mDBIP = intent.getStringExtra("DB_IP");
mDBName = intent.getStringExtra("DB_NAME");
mDBUsername = intent.getStringExtra("DB_USER");
mDBPassword = intent.getStringExtra("DB_PASS");
mServerIP = intent.getStringExtra("SERVER_IP");

if (Utility.checkLocationPermission(context)) {
try {
GPSTracker mGPS = new GPSTracker(context);
// check if GPS enabled
if (mGPS.canGetLocation()) {
double latitude = mGPS.getLatitude();
double longitude = mGPS.getLongitude();

// more code here

问题是当我的手机保持唤醒状态时该应用程序运行良好,如果手机处于休眠状态,它就无法运行。我想在手机休眠时发送数据,我该怎么做?

最佳答案

为了更好地满足此要求,您可以使用 JobScheduler API。

AlarmManager 已过时。

使用 JobScheduler 的优势:

  1. 在设备重启时,您无需接收 OnBootComplete 操作即可重启服务
  2. 您可以在设备电量不足时暂时停止服务,以避免糟糕的用户体验。
  3. 在后台将数据从设备同步到服务器的最佳方式。

我测试过它工作正常。有关更多信息,请查看以下链接。

引用以下链接:

http://www.vogella.com/tutorials/AndroidTaskScheduling/article.html#schedulingtasks

https://developer.android.com/reference/android/app/job/JobScheduler.html

如果有任何不清楚的地方,请告诉我,我们会分享工作示例,如果有帮助,请告诉我。

使用下面的工作示例:

  public class PollingService extends JobService {

@Override
public boolean onStartJob(JobParameters params) {
Log.d("PollingService", "onStartJob in PollingService is called");
jobFinished(params, false);
return false;
}

@Override
public boolean onStopJob(JobParameters params) {
Log.d("PollingService", "onStopJob in PollingService is called");
return false;
}
}

在 list 中注册:

<service
android:name=".Services.PollingService"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE" />

在 Activity 中使用以下代码启动服务:

    //put this in oncreate of Activity or from where u want to start
JobScheduler mJobScheduler = JobScheduler.getInstance(getApplicationContext());

buidJob(); //Method call

//Method
private void buidJob() {
JobInfo.Builder jobinfo = new JobInfo.Builder(100,new ComponentName(this,PollingService.class));
jobinfo.setPeriodic(50*1000).
setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED).
setPersisted(true);
//build();

mJobScheduler.schedule(jobinfo.build());
Log.d(TAG,"buidJob()");
}

依赖:

 compile 'me.tatarka.support:jobscheduler:0.1.1'

支持 aar 以上使用的低端版本。如果我们按照上面提到的链接进行操作,您可以在不使用上面的 aar 的情况下完成。

关于android - BroacastReceiver 在设备休眠时不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45606434/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com