2015-06-19 54 views
0

我首先说我已经看到了Activity Lifecycle图(http://developer.android.com/reference/android/app/Activity.html),而实际上我完全理解它。区分Android onDestroy事件

我该如何解决这个问题,如果有一个onDestroy事件,那么就没有回来,这个活动肯定是在关闭的过程中。

所有其他涉及再次显示活动的能力都在onCreate和onStop之间(包括两者在内)。

我正在创建一个应用程序来轮询自定义蓝牙设备的一些测量结果。我希望保持连接(蓝牙),但我也想发现用户是否杀死了活动(通过杀死应用程序从任务栏中删除),以便我可以再发送一件东西到设备并断开套接字。所以按照我的理解,我可以把代码放在onDestroy中。然而,事实证明(索尼Xperia Z3和三星Galaxy S2),当用户点击电源按钮时,onDestroy也正在执行,从而锁定屏幕。当屏幕解锁后,会创建一个新的Activity(这是我的猜测)并运行onCreate。正如你可以猜到 - 我的设备是因为我投入的onDestroy

代码断开

普通自动关屏+锁不会做的onDestroy ...

所以问题是: 是否有办法区分真正破坏活动的onDestroy,以及当用户解锁屏幕后,将重新创建相同活动的onDestroy?我只想向这真的,真的的onDestroy事件作出反应

回答

3

是有区别的onDestroy的方式,破坏了你的活动:

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if (isFinishing()) { 
     // Bye-bye 
    } else { 
     // I'll be back 
    } 
} 
+0

这只与检测'finish'()是否被调用(或不是视情况而定)'Activity'是否被销毁有关。如果OP没有明确地调用finish(),那么它将不会给出任何有效的指示,说明用户按下“BACK”后是否终止了“Activity”,或者是因为用户提到的设备的所谓行为按下电源按钮强制锁定设备。 – Squonk

+0

这实际上为我工作,因为我有一个自定义后退按钮的行为,我把finish()里面。 然而,它真的很糟糕如果设备做的东西是非常不同的android设备应该做的: – maslan

2

只是想指出 - onDestroy()不是一个“事件”这是一个方法,当Activity正在经历其生命周期的销毁阶段时由系统调用。

至于onDestroy()被称为自动关屏的结果很简单,因为当前显示的Activity停止,不被破坏 - 作为一个结果,onPause()onStop()将被调用,仅此而已。当设备解锁后,Activity重新启动和恢复(onRestart(...)onStart()onResume()被调用。

如果您提及是导致不同的行为与其他主流设备两台设备,然后这显然是不规范的实现的例子(当然,对于三星来说,他们已经用设备反复地做过非标准的事情,这当然没什么新意)。

我建议你创建自己的基地Activity并添加日志记录以追踪到底发生了什么。Example ...

public class MyBaseActivity extends Activity { 

    protected final String TAG = this.getClass().getName(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.d(TAG, "Entering onCreate(...)"); 
    } 

    // Override all of the lifecycle methods and add a 
    // single line to log entering the method as above. 
    // Don't add any other code except the call to the 
    // super methods if mandatory. 
} 

您随后需要做的所有事情就是在您的应用程序中添加Activity时始终扩展您的基地Activity,并始终确保从覆盖的任何生命周期方法中调用super.<method-name>

如果您发现您提到的设备确实是真的,那么您唯一真正的选择是在Service而不是Activity中处理蓝牙。