Базовая служба Android, использующая GPS, вызывает перезагрузку Google Nexus One

Я создал очень простую программу для отслеживания координат GPS. В программе есть кнопка, которая включает и выключает службу. Служба просто устанавливает LocationListener. При каждом onLocationChanged координаты местоположения сбрасываются на SD-карту.

Приложение работает нормально. Но когда я нажимаю кнопку сна, приложение какое-то время регистрирует данные, а затем перезагружает Google Nexus One.

Ниже я публикую МИНИМАЛЬНЫЙ код, который требуется для воспроизведения этой ошибки. Я вырезал дополнительный код, чтобы избежать путаницы.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.phonetracker"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".PhoneTrackerActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".MyGPSService" android:process=":my_gps_service" />
    </application>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>

макет/main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <Button
     android:id="@+id/on_button_click" 
     android:layout_height="wrap_content"
     android:layout_width="wrap_content"
     android:text="@string/on_button_click"
     android:onClick="onButtonClick" />

</LinearLayout>

значения/strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="hello">Hello World, PhoneTrackerActivity!</string>
    <string name="app_name">PhoneTracker</string>
    <string name="on_button_click">Start Service</string>

</resources>

PhoneTrackerActivity.java

package com.phonetracker;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class PhoneTrackerActivity extends Activity
{
    private static final String TAG = "MyGPSServiceDemoActivity";
    private Intent intent           = null;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button button = (Button)findViewById(R.id.on_button_click);

        if (isMyServiceRunning())
        {
            button.setText("Stop Service");
        }
        else
        {
            button.setText("Start Service");
        }

        if (intent == null)
            intent = new Intent(this, MyGPSService.class);
    }

    public void onButtonClick(View view)
    {
        Log.e(TAG, "onButtonClick");

        Button button = (Button)view;

        if (isMyServiceRunning())
        {
            stopService(intent);
            button.setText("Start Service");
        }
        else
        {
            startService(intent);
            button.setText("Stop Service");
        }
    }

    private boolean isMyServiceRunning()
    {
        Log.e(TAG, "isMyServiceRunning");

        ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
        for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE))
        {
            if ("com.gpsservicedemo.MyGPSService".equals(service.service.getClassName()))
            {
                return true;
            }
        }
        return false;
    }
}

MyGPSService.java

package com.phonetracker;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.LocationManager;
import android.os.IBinder;
import android.util.Log;

public class MyGPSService extends Service
{
    private static final String TAG                     = "Hx2MyGPSService";
    private LocationManager locationManager             = null;
    private GPSLocationListener gpsLocationListener     = null;

    @Override
    public IBinder onBind(Intent arg0)
    {
        Log.e(TAG, "onBind");

        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        Log.e(TAG, "onStartCommand");

        super.onStartCommand(intent, flags, startId);

        return START_STICKY;
    }

    @Override
    public void onCreate()
    {
        Log.e(TAG, "onCreate");

        locationManager     = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
        gpsLocationListener = new GPSLocationListener();
        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
        {
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, gpsLocationListener);
        }
    }

    @Override
    public void onDestroy()
    {
        Log.e(TAG, "onDestroy");

        super.onDestroy();

        if (locationManager != null)
        {
            try
            {
                locationManager.removeUpdates(gpsLocationListener);
            }
            catch (Exception ex)
            {
                Log.e(TAG, "fail to remove location listners, ignore", ex);
            }
        }

        gpsLocationListener.closeOperations();
    }
}

GPSLocationListener.java

package com.phonetracker;

import android.location.Location;
import android.location.LocationListener;
import android.os.Bundle;
import android.util.Log;

public class GPSLocationListener implements LocationListener
{
    private static final String TAG = "Hx2GPSLocationListener";

    public GPSLocationListener ()
    {
        Log.e(TAG, "GPSLocationListener");
    }

    @Override
    public void onLocationChanged(Location location)
    {
        Log.e(TAG, "onLocationChanged");
    }

    @Override
    public void onProviderDisabled(String provider)
    {
        Log.e(TAG, "onProviderDisabled");
    }

    @Override
    public void onProviderEnabled(String provider)
    {
        Log.e(TAG, "onProviderEnabled");
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras)
    {
        Log.e(TAG, "onStatusChanged");
    }

    public void closeOperations()
    {
        Log.e(TAG, "closeOperations");
    }
}

Пожалуйста, посмотрите, не упускаю ли я что-то.


person Haider    schedule 18.06.2012    source источник
comment
Можете ли вы также опубликовать logcat до перезагрузки?   -  person SERPRO    schedule 18.06.2012
comment
@SERPRO Если я запускаю приложение при подключении к компьютеру или при использовании такого приложения, как alogrec, перезагрузка не происходит. Поэтому я не могу предоставить logcat. Однако, если есть какой-то другой способ найти logcat, пожалуйста, дайте мне знать.   -  person Haider    schedule 18.06.2012
comment
вы можете взглянуть на этот вопрос: stackoverflow.com/questions/3469016/ это может помочь вам узнать logcat   -  person SERPRO    schedule 18.06.2012
comment
@SERPRO При подключении к компьютеру приложение не вызывает перезагрузку, не знаю почему. У меня к вам вопрос: как эксперт по андроиду, видите ли вы что-нибудь в приведенном выше коде, что могло бы перезагрузить телефон? Я постараюсь получить журналы завтра IA и опубликовать здесь. Завтра в это же время. Кроме того, я попробовал приложение на телефоне Samsung, и оно не вызывает там перезагрузки. Однако в Samsung функция isMyServiceRunning() по какой-то причине всегда возвращает false.   -  person Haider    schedule 18.06.2012
comment
Что ж, я вижу некоторые улучшения в вашем способе обнаружения запущенных служб. Это может быть проблемой. Попробуйте то, что было предложено в этом ответе: stackoverflow.com/a/608600/571353   -  person SERPRO    schedule 18.06.2012
comment
Я скопировал функцию isMyServiceRunning() из того же потока. Это второй пост с 123 плюсами. Но эта функция вызывается только при отображении представления или нажатии кнопки. Мое приложение перезагружает телефон, когда он находится в режиме сна/ожидания.   -  person Haider    schedule 18.06.2012
comment
Плохой код никак не может вызвать перезагрузку, в основном это ошибка в телефоне, хотя может быть способ обойти это.   -  person mbwasi    schedule 18.06.2012