2

私は現在、車の運転者のログブック用の GPS 追跡アプリ (距離のみ、各値を保存したり、MapView に表示したりしない) に取り組んでいます。スマホがドックされているせいか、消費電力は気にならない。これまでの私の実装は、経度/緯度を取得する GPS ヘルパー クラスを呼び出すアクティビティです。アクティビティ自体が走行距離を計算し、それをユーザーに表示して、距離も表示する通知バーを開始します。アクティビティをアクティブに保ち、OS によって強制終了されないようにするために、アクティビティに PARTIAL WakeLock を使用しています。

私の問題は、これが正しく機能していないことです。これは、WakeLock にもかかわらず、アプリが OS によって強制終了されたように見えるためです。通知バーの項目をクリックすると (たとえば 15 ~ 30 分後)、ランニング アクティビティの走行距離を確認すると、アクティビティが新しい GPS トラックを開始するように表示されて、それが殺されていると思います。以前に開始したトラックからの走行距離を表示する代わりに。WAKELOCK Permission がマニフェストで正しく設定されている。

私の質問は、この構造体が機能するかどうか、またはこれを行うためのより良い方法があるかどうかを知ることです?

4

2 に答える 2

1

通知をクリックしたときに起動するインテントに問題がある可能性があります。この意図は、古いアクティビティをフォアグラウンドに戻すのではなく、まったく新しいアクティビティを起動したいと考えている可能性が最も高いです。

このリンクは、あなたが望むことをするのに役立つかもしれません:

通知を介してAndroidの既存のアクティビティを前面に表示する方法

于 2012-02-19T11:35:54.557 に答える
0

通知が必要な startForground を呼び出すサービスを使用する必要があります。この通知は、アプリへのエントリ ポイントになります。このサービスは、アクティビティのライフサイクルに依存することなく、バックグラウンドで実行され、座標をログに記録できます。

    @Override
        public int onStartCommand(Intent intent, int flags, int startId) {

            if(intent.getAction().equals(DRIVELOG_ACTION_STOPLOGGING)){               handleStopLoggingCommand(intent.getBooleanExtra(SAVE_LOG,false));
            }
            else if(intent.getAction().equals(DRIVELOG_ACTION_STARTLOGGING)){
                handleStartLoggingCommand();
            }
            return START_STICKY;
        }


   private void handleStartLoggingCommand() {
        startForeground(DriveLoggerNotification.notificationId,DriveLoggerNotification.createInDriveLogNotification(this,driveLogLiveData));
    if(googleApiClient.isConnected()){
        startMonitoringLocation();
    }else {
        googleApiClient.connect();
    }

}

このコードは私の GpsLoggingService からのものです

于 2015-03-10T14:58:42.087 に答える