设备睡眠时BroacastReceiver不起作用?

时间:2017-08-10 06:50:47

标签: android

我正在编写一个应用来跟踪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

问题是,当我保持手机清醒时应用程序正常工作,如果手机睡眠,它没有工作。即使手机睡觉我也希望发送数据,我该怎么做?

4 个答案:

答案 0 :(得分:1)

为了更好地实现此要求,请使用JobScheduler API。

AlarmManager已过时。

使用JobScheduler的优点:

  1. 在设备重启时,您无需接收OnBootComplete操作即可重新启动服务
  2. 当设备电池​​电量不足时,U可以暂时停止服务,以避免用户体验不佳。
  3. 在后台同步数据从设备到服务器的最佳方式。
  4. 我测试它工作正常。有关详细信息,请查看以下链接。

    供参考,请浏览以下链接:

    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(...);
}

并在广播接收器中设置下一个警报