簡體   English   中英

Android-定位服務僅在連接到計算機后才在后台運行

[英]Android - location service not running in background, only when connected to the computer

我創建了一個具有LocationListener的服務。 在Fragment中,我有一個BroadcastReceiver,可以從服務成功接收位置。 當電話連接到我的計算機並且我按下“運行”(不是調試模式)時,一切正常。 正如我在Android Studio的“運行”控制台中看到的那樣,當手機屏幕關閉時,我會連續收到位置信息。

但是,當我斷開手機與計算機的連接並關閉屏幕時,我停止接收位置更新。 或者,在停止之前,我僅獲得了一兩個位置更新。 然后,當再次打開屏幕時,服務將開始發送位置更新。

我曾嘗試在Fragment和Service上使用WakeLock,但似乎沒有任何效果。

有人能幫助我嗎!?... :,(

在我的服務中,我在putExtra()中設置了一個ArrayList-> String,它包含一個緯度和一個時間戳,以便我可以查看鎖屏時listener是否確實更新了位置。 然后在“片段”中,將結果顯示在視圖中,以便可以手動調試。

這是我的服務代碼:

public class GpsService extends Service {

private LocationListener listener;
private LocationManager locationManager;
private Intent mIntent;

private ArrayList<String> latTimeArrayList = new ArrayList<>();

private PowerManager.WakeLock wakeLock;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);
    mIntent = new Intent("location_update");

    PowerManager mgr = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
    wakeLock.acquire();

    return START_NOT_STICKY;
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    listener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {

            mIntent.putExtra("Latitude", location.getLatitude());
            mIntent.putExtra("Longitude", location.getLongitude());

            if(latTimeArrayList.size() < 10){

                latTimeArrayList.add(location.getLatitude() + " -> " + new Date());

            }else if(latTimeArrayList.size() == 10){
                mIntent.putExtra("latTimeArray", latTimeArrayList);
            }
            sendBroadcast(mIntent);
        }

        @Override
        public void onStatusChanged(String s, int i, Bundle bundle) {

        }

        @Override
        public void onProviderEnabled(String s) {

        }

        @Override
        public void onProviderDisabled(String s) {

        }
    };

    //noinspection MissingPermission
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 100, 0, listener);
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 0, listener);

}

@Override
public void onDestroy() {
    super.onDestroy();
    if(locationManager != null){
        //noinspection MissingPermission
        locationManager.removeUpdates(listener);
        wakeLock.release();
    }
}

}

private BroadcastReceiver broadcastReceiver;
ArrayList<String> aString = new ArrayList<>();
private String mmtext = "";
TextView debugtext = (TextView) mView.findViewById(R.id.hasCompletedTrack);
int doagain = 0;
@Override
public void onResume() {
    super.onResume();

    if(broadcastReceiver == null){
        broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                try{
                    if (doagain == 0){
                        aString = (ArrayList<String>)intent.getExtras().get("latTimeArray");
                        if(aString != null || aString.size() != 0){

                            for (int i =0; i< aString.size(); i++){
                                mmtext += aString.get(i) + "\n";
                            }
                            doagain = 1;
                            debugtext.setText(mmtext);
                        }
                    }


                }catch(NullPointerException e){}

我找到了答案...

我必須在三星Galaxy S6 edge上關閉PoweSaving模式

另外,在我的broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) {

那是在我的Fragment中,對於使用Intent getExtra()從服務中獲得的每個位置更新,我都進行了一些位置計算(這不在我發布的代碼中)。 但是onReceive()僅在屏幕打開(未鎖定)時觸發。 因此,僅在屏幕上觸發該計算方法時,才觸發該片段中的計算。

我對此的解決方案是直接在我的服務中處理所有計算。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM