当我的应用程序退出时,我的GPS传感器继续工作或当我更改活动时,我的应用程序崩溃取决于我的配置(在下面的代码中,当我更改活动或退出应用程序时崩溃)。如何更改以下活动,以便在我退出应用程序时GPS传感器停止运行,但当我移动到另一个活动时,它会继续运行?
以下是我的活动的关键部分:
public class InitialChoice extends Activity {
LocationManager mlocManager;
LocationListener mlocListener;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.initial_screen);
mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
mlocListener = new MyLocationListener();
mlocManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
}
@Override
protected void onStop(){
//mlocManager.removeUpdates(mlocListener);
mlocManager.removeGpsStatusListener((Listener) mlocListener);
mlocManager = null;
}
}
如果我使用以下代码而不是onStop(),gps将不会停止运行:
@Override
public void finish(){
//mlocManager.removeUpdates(mlocListener);
mlocListener = null;
mlocManager = null;
}
logcat的:
12-16 21:54:58.120:D / LocationManager(909):requestLocationUpdates:provider = gps,listener = com.dummies.android.taskreminder.MyLocationListener@46284458 12-16 21:55:04.740:D / AndroidRuntime(909):关闭VM 12-16 21:55:04.740:W / dalvikvm(909):threadid = 1:线程退出,未捕获异常(group = 0x400259f8) 12-16 21:55:04.750:E / AndroidRuntime(909):致命异常:主要 12-16 21:55:04.750:E / AndroidRuntime(909):java.lang.RuntimeException:无法停止活动{com.dummies.android.taskreminder / com.dummies.android.taskreminder.activity.InitialChoice}:java。 lang.ClassCastException:com.dummies.android.taskreminder.MyLocationListener 12-16 21:55:04.750:E / AndroidRuntime(909):在android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3632) 12-16 21:55:04.750:E / AndroidRuntime(909):在android.app.ActivityThread.handleStopActivity(ActivityThread.java:3677) 12-16 21:55:04.750:E / AndroidRuntime(909):在android.app.ActivityThread.access $ 2600(ActivityThread.java:135) 12-16 21:55:04.750:E / AndroidRuntime(909):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2153) 12-16 21:55:04.750:E / AndroidRuntime(909):在android.os.Handler.dispatchMessage(Handler.java:99) 12-16 21:55:04.750:E / AndroidRuntime(909):在android.os.Looper.loop(Looper.java:144) 12-16 21:55:04.750:E / AndroidRuntime(909):在android.app.ActivityThread.main(ActivityThread.java:4937) 12-16 21:55:04.750:E / AndroidRuntime(909):at java.lang.reflect.Method.invokeNative(Native Method)
从我这里获取方法的新错误:Stop Location Listener in Android
12-16 23:10:50.295:W / dalvikvm(1272):threadid = 1:线程退出时未捕获异常(group = 0x400259f8) 12-16 23:10:50.305:E / AndroidRuntime(1272):致命异常:主要 12-16 23:10:50.305:E / AndroidRuntime(1272):java.lang.RuntimeException:无法停止活动{com.dummies.android.taskreminder / com.dummies.android.taskreminder.activity.InitialChoice}:android。 app.SuperNotCalledException:Activity {com.dummies.android.taskreminder / com.dummies.android.taskreminder.activity.InitialChoice}没有调用super.onStop() 12-16 23:10:50.305:E / AndroidRuntime(1272):在android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3632) 12-16 23:10:50.305:E / AndroidRuntime(1272):在android.app.ActivityThread.handleStopActivity(ActivityThread.java:3677)
答案 0 :(得分:2)
当您的位置侦听器:
时,您向侦听器的转换声明:
LocationListener mlocListener;
实例:
mlocListener = new MyLocationListener();
铸造:
(Listener) mlocListener
Yout Logcat在此解释:
java.lang.ClassCastException:com.dummies.android.taskreminder.MyLocationListener 12-16
答案 1 :(得分:1)
为初学者尝试覆盖finish()
而不是`onStop()'
我做的另一件事是在onLocationChanged()
获得一个位置后将gpslistener设置为null,最后,如果你需要继续获取位置更新,那么你应该考虑创建一个服务,而不是做活动中的gps监听器。
这样你可以更轻松地杀死服务,这会杀死听众
答案 2 :(得分:1)
目前这似乎运作得相当好,但可能有更好的方法(后台线程.....):
@Override
public void onDestroy(){
mlocManager.removeUpdates(mlocListener);
super.onDestroy();
}
@Override
public void onResume(){
mlocManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
super.onResume();
}
}