2

友達、

2分ごとに呼び出されるAndroidバックグラウンドサービスを作成しました。呼び出されると、GPS とネットワークの locationUpdates を 40 秒間リッスンし始めます。有用な情報(緯度、経度、精度、プロバイダー...)を抽出し、データをサーバーに送信しました。

エミュレーターでアプリケーションを実行すると、正常に動作します。(すべての変数のデフォルト値だけで、実際のGPS情報は取得できませんが、サービスが2分ごとに呼び出され、データをサーバーに送信することはわかっています)

したがって、実際のデバイスでアプリケーションを実行すると、40 分程度で完璧に動作します。それから、何かが私のサービスを閉鎖していると思います。(メモリ消費などの理由でおそらくAndroid自体)

バグを追跡する方法、またはバグの原因を知っている人はいますか???

ここに私のコードのいくつか:

                       private Runnable mUpdateTimeTask = new Runnable() {
    public void run() {
        Log.i(ctx.getString(R.string.app_name),
                "HUJIDataCollectionService, mUpdateTimeTask1 start");
        setuplistenerandrequestupdates();
        mHandler.removeCallbacks(mUpdateTimeTask);
//!     Log.i(ctx.getString(R.string.app_name),"HUJIDataCollectionService, mUpdateTimeTask stop");
    }
};
private Runnable mUpdateTimeTask2 = new Runnable() {
    public void run() {
        Log.i(ctx.getString(R.string.app_name),"HUJIDataCollectionService, mUpdateTimeTask2 start");
        // Send Data to Server here!!
        sendDataToServer();
        // Remove LocationUpdates here!!!
        managerS.removeUpdates(listenerS);
        mHandler.removeCallbacks(mUpdateTimeTask2);
//!     Log.i(ctx.getString(R.string.app_name),"HUJIDataCollectionService,  mUpdateTimeTask2 stop");
    }
};

private TimerTask startServiceTask = new TimerTask() {
    @Override
    public void run() {
        Log.i(ctx.getString(R.string.app_name),"HUJIDataCollectionService, startServiceTask, run()1");

        // Start Locationupdates here!!!!

        longitude = 0;
        latitude = 0;
        locationprovider = "";
        locationproviderConverted = 0;
        locationAccuracy = 100000;
        // remove old updates from timer tasks
        mHandler.removeCallbacks(mUpdateTimeTask);
        mHandler.removeCallbacks(mUpdateTimeTask2);


        mHandler.postDelayed(mUpdateTimeTask, 1000);

        mHandler.postDelayed(mUpdateTimeTask2,
                conf_LocationUpdatePeriodInSec * 1000);


    }

};

@Override
public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);
//! Log.i(ctx.getString(R.string.app_name),"HUJIDataCollectionService, onStart");

    ShowNotification();

    LoadPreferences();
    startDataCollectionServiceIntervallTimer = new Timer(
            "HUJIDataCollectionServiceStartTimer");

    startDataCollectionServiceIntervallTimer.schedule(startServiceTask,
            1000L, conf_sampleTimeInMin * 60 * 1000L);
    // Starting StopTimer(Thread) to stop listening for location updates
    mHandler = new Handler();


}


           private void setuplistenerandrequestupdates() {

//! Log.i(ctx.getString(R.string.app_name),"HUJIDataCollectionService, setupListenerAndRequestUpdates");
    managerS = (LocationManager) ctx
            .getSystemService(Context.LOCATION_SERVICE);

//! Log.i(ctx.getString(R.string.app_name), "HUJIDataCollectionService, 1");
    listenerS = new LocationListener() {

        @Override
        public void onStatusChanged(String arg0, int arg1, Bundle arg2) {

        }

        @Override
        public void onProviderEnabled(String arg0) {

        }

        @Override
        public void onProviderDisabled(String arg0) {

        }

        @Override
        public void onLocationChanged(Location location) {

            // storing data from the latest location update
            float tempLocLongitude = (float) location.getLongitude();
            float tempLocLatitude = (float) location.getLatitude();
            float tempLocAccuracy = location.getAccuracy();
            String tempLocProvider = location.getProvider();

            //Log.i(ctx.getString(R.string.app_name),
            //      "HUJIDataCollectionService, setupListenerAndRequestUpdates, location Changed");

            // if accuracy of new location is better than existing, store
            // accuracy,latitude,longitude and location provider
            if ((tempLocAccuracy < locationAccuracy)
                    && (tempLocAccuracy != 0.0)) {

                // store current latitude
                latitude = tempLocLatitude;
                // store current longitude
                longitude = tempLocLongitude;
                // store current provider
                locationprovider = tempLocProvider;
                // store current accuracy
                locationAccuracy = (int) tempLocAccuracy;
                // converts the String value of locationprovider to the
                // required integer value for the server
                convertLocationProvider();

            }
        }

    };

どうもありがとう!

4

2 に答える 2

4

おそらく Android は、あまりにも長く存続し、途中であまりにも多くのリソースを消費するため、あなたのサービスを殺しています.

ユーザーがあなたのアプリを高く評価すると思われる場合 (アプリが作成されているため、ユーザーがアプリを実行し続けた場合、ユーザーのバッテリー寿命はわずか 2 時間です)、これを使用startForeground()して、サービスがフォアグラウンドの一部であることを Android に示します。ユーザー体験。

個人的には、あまり多くの電力を消費しないように、アプリの動作を再考することをお勧めします。たとえば、AlarmManagermy に似たものを使用して、1 時間ごとに場所を確認しますLocationPoller。これにより、GPS をオンにしておく頻度と時間が短縮されるだけでなく、ポーリング間でサービスがメモリ不足になります。

于 2011-11-02T15:23:42.107 に答える
0

以下も使用する必要があります。

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Your code here or in onStart as you did...

    return START_STICKY;        
}
于 2013-06-02T20:15:49.193 に答える