让我的 GPS 传感器停止时遇到一些问题

Posted

技术标签:

【中文标题】让我的 GPS 传感器停止时遇到一些问题【英文标题】:Having some trouble getting my GPS sensor to stop 【发布时间】:2012-01-22 07:44:20 【问题描述】:

当我的应用程序退出时,我的 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): 关闭虚拟机 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:活动 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)

【问题讨论】:

Logcat 崩溃时会说什么? 添加了上面的 Logcat。有什么想法吗? 【参考方案1】:

当它是一个位置监听器时,你向一个监听器投射:

声明:

 LocationListener mlocListener; 

实例化:

 mlocListener = new MyLocationListener();

演员:

 (Listener) mlocListener

Yout Logcat 在这里解释:

java.lang.ClassCastException: com.dummies.android.taskreminder.MyLocationListener 12-16

【讨论】:

好的,但是该方法需要一个监听器,如果我不重铸它会出现错误。我可以使用其他方法来接受 LocationListener 吗? 我试过了,但总是崩溃:***.com/questions/6894234/… 使用 removeUpdates 那么你的 logcat 会说什么。你真的需要习惯阅读你的 logcat 来调试你的错误,而不是仅仅说“它崩溃了” 会的,上面还添加了 LogCat 信息。活动无法停止? 只需调用 super.onStop();在 onStop() 方法的最后一行,logcat 说明了一切!【参考方案2】:

尝试覆盖 finish() 而不是 `onStop()' 对于初学者

我做的另一件事是在获得onLocationChanged() 的位置后将gpslistener 设置为null,最后,如果您需要继续获取位置更新,那么您应该考虑创建服务,而不是执行gps活动中的监听器。

这样你可以更容易地终止服务,这将终止监听器

【讨论】:

我已将 'onStop' 方法更改为:@Override public void finish() //mlocManager.removeUpdates(mlocListener); mlocListener = null; mlocManager = null; 但 GPS 传感器现在保持开启状态 哇,不要覆盖完成,覆盖 onPause 或 onStop ,根据您想要停止收听的活动生命周期中的哪个位置。覆盖完成仅适用于您明确完成活动时,而不是像大多数情况一样切换活动时。 @Blundell,文档警告不要使用 onStop,因为它可能并不总是被调用。 onPause 更好。他说,如果他退出应用程序,他会试图停止,而不仅仅是切换活动。 finish() 是合适的 @CQM finish() 在使用返回按钮退出活动时不会被调用。同意他应该使用 onPause 我在上面添加了一些代码,但是当我离开主要活动时传感器停止侦听。除了将上述代码添加到我的所有活动之外,你能想出一个更好的方法来让它一直运行直到我离开应用程序吗?【参考方案3】:

目前这似乎工作得相当好,但可能有更好的方法(后台线程.....):

@Override
public void onDestroy()
mlocManager.removeUpdates(mlocListener);

    super.onDestroy();
 

@Override
public void onResume()

    mlocManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
    super.onResume();



【讨论】:

以上是关于让我的 GPS 传感器停止时遇到一些问题的主要内容,如果未能解决你的问题,请参考以下文章

灵敏度 Android 位置传感器

传感器特性的一些理解

Java:下载总是停止

delphi xe10 android服务gps [重复]

通过 iCloud 仅同步“一些”我的 coreData

仅在单击按钮时获取当前 GPS 位置,然后停止使用 GPS