我正在编写一个应用来跟踪Google地图上的路线历史记录。它将每5分钟获取一次设备的当前位置,并通过webservice将数据发送到服务器。
此代码从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中,我得到lat-long并调用webservice。
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
问题是,当我保持手机清醒时应用程序正常工作,如果手机睡眠,它没有工作。即使手机睡觉我也希望发送数据,我该怎么做?
答案 0 :(得分:1)
为了更好地实现此要求,请使用JobScheduler API。
AlarmManager已过时。
使用JobScheduler的优点:
我测试它工作正常。有关详细信息,请查看以下链接。
供参考,请浏览以下链接:
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;
}
}
在Manifest中注册:
<service
android:name=".Services.PollingService"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE" />
在“活动”中使用以下代码启动服务:
//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以上使用的低端版本。如果我们按照上面提到的链接,您可以使用以上方式完成。
答案 1 :(得分:0)
Android 8.0(O)中有很多行为更改, 我们都应该在这里承认这些问题&gt;&gt; What's new in Android 8.0 ?
检查您是否定位到API级别26(我认为您是)
app > build.gradle > targetSdkVersion
如果那时,我认为您应该查看此链接&gt;&gt; Background location limits
答案 2 :(得分:0)
使用WakeLock,唤醒锁是一种机制,用于指示您的应用程序需要让设备保持打开状态。
<uses-permission android:name="android.permission.WAKE_LOCK"/>
注意:唤醒锁只会在onRecieve方法的持续时间内保持设备开启。如果您希望将设备保留一段时间,library可能会有所帮助
答案 3 :(得分:0)
使用AlarmManager.ELAPSED_REALTIME_WAKEUP
并将这些条件用于设置闹钟
if(Build.VERSION.SDK_INT < 23){
if(Build.VERSION.SDK_INT >= 19){
setExact(...);
}
else{
set(...);
}
}
else{
setExactAndAllowWhileIdle(...);
}
并在广播接收器中设置下一个警报