在我的应用程序中,我需要检测我的应用程序是进入后台还是切换到同一应用程序的另一个活动...我知道我必须使用onPause方法...但是如何区分这两种情况呢?
谢谢!
这是我从一本书中读到的:
在onPause()之后,可以静默销毁活动.我们永远不应该假设调用onStop()或onDestroy().
但根据文档,Pause指的是部分可见,可以在不调用onStop或onDestory的情况下杀死部分可见的活动吗?
我有一个关于 Android 中的 Activity Lifecycle 的问题。我想知道,在什么情况下调用 onRestoreInstanceState() 方法?
文档说
“仅当存在要恢复的已保存状态时,系统才会调用 onRestoreInstanceState()”
但我想知道这种情况什么时候会发生。它是否仅适用于屏幕旋转的情况,当前台活动被销毁并重新创建时?
我有一个服务从服务器收听一些事件.一个服务有START_STICKY标志,当他被操作系统杀死时,它会重新启动.当服务收到一个事件我有两个场景.首先,如果活动没有被杀死,我需要将结果发送到本地广播接收器并更新UI.其次,如果它被OS杀死我想重新创建它并以捆绑方式发送数据.
但我不知道如何识别android杀死了我的活动.onDestroy活动事件不会出现这种情况.
@Override
public void onComplete(CurrentOrdersResponse response) {
if (response == null) {
return;
}
boolean isActivityDestroyed = mPreferences.getBoolean(MainActivity.IS_MAIN_ACTIVITY_DESTROYED_PREF_KEY, false);
if (!isActivityDestroyed)
sendResult(response.getResJSONStr(), CURRENT_ORDERS_ACTION);
else {
Intent intent = new Intent(this, MainActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtras(extras);
startActivity(intent);
}
int resCode = response.getResCode();
Log.i(LOG_TAG, "Service resCode" + " " + resCode);
}
Run Code Online (Sandbox Code Playgroud) 我正在制作我的第一个基于Socket.io的android应用程序。套接字从Web服务发送和接收数据。应用程序中有许多不同功能的屏幕。如何在这些不同的活动中使用相同的套接字连接。
我尝试过将Socket对象设置和存储在Application类中,它似乎运行良好,但是当应用程序进入后台并在后台放置了一段时间后,应用程序被杀死,套接字对象为NULL,导致aoo崩溃。空指针异常。
public class MyApplication extends Application {
private Socket mSocket;
private final String TAG = "Application Class";
public Socket getSocket() {
return mSocket;
}
public Socket createSocket() {
try {
Manager manager = new Manager(new URI("http://0.0.0.0"));
} catch (URISyntaxException URIse) {
URIse.printStackTrace();
}
return mSocket;
}
}
Run Code Online (Sandbox Code Playgroud)
在活动中访问套接字
MyApplication app;
app = (MyApplication ) getApplication();
app.getSocket;
Run Code Online (Sandbox Code Playgroud) 我想调用onDestroy()方法而不调用生命周期的其他方法除了onCreate()方法.
这个问题是针对熟悉Activity Lifecycle 的Android 开发人员的。
我正在开发一个执行面部检测和面部标志识别的应用程序。
相应的机器学习模型需要很长时间才能从 SD 存储中解析并加载到内存中。在当前的平均 Android 设备上,很容易需要长达 20 秒的时间。顺便说一句,所有这些面部分析内容和模型加载都发生在 C++ 本机代码中,并使用 Android NDK + JNI 进行集成。
由于模型加载需要很长时间,因此实际的解析和加载是通过 AsyncTasks 提前安排在后台的,因此用户不会注意到巨大的延迟。
在执行实际的人脸分析之前,用户可以通过 MediaStore.ACTION_IMAGE_CAPTURE 进行自拍。这将调用设备上安装的单独相机应用程序并通过 onActivityResult 接收图片。
现在问题开始了:当用户位于单独的相机活动/应用程序中时,几乎总是整个应用程序进程都会被终止。大多数情况下,它似乎发生在从相机应用程序返回之前(时间似乎很奇怪)。我做了另一个测试,以确认在相机应用程序内按下拍摄按钮时会发生这种情况。在那一刻,我的应用程序被杀死了。当按下“接受图像”按钮时,将重新创建应用程序。ActivityManager 在 logcat 中给出的进程终止原因是“prev LAST”(我通过 Google 没有找到任何关于此含义的信息,但我看到许多其他应用程序也因这个原因被终止,所以它似乎发生了经常)。
因此,我的应用程序的所有 Activity 都需要由 Android 重新创建(对我来说很好,因为它发生得很快),而且面部分析模型也必须从头开始重新加载,用户会注意到在自拍之前有巨大的延迟可以进行处理。
我的问题是:是否有可能告诉Android,活动/应用程序有合法的理由在暂时处于后台获取相机图片时不被杀死?毕竟,ActivityManager 做出了终止应用程序的错误决定。如此频繁地重新加载模型会占用大量的 CPU 和内存资源。
这似乎是 Android 生命周期架构中的一个疏忽。我知道很少有应用程序有我的应用程序的特定要求,但它仍然看起来很愚蠢。我能想到的“解决”这个问题的唯一方法是在应用程序中实现我自己的相机 Activity,但这违背了 Android 自己的最佳实践。
还有一些“android:persistent”标志,您可以通过 AndroidManifest.xml 坚持您的 Activity,但文档完全不清楚其含义。请参阅有关此的文档。
顺便说一句:当应用程序进程被杀死时,onDestroy 不会被调用。我在某处读到不能保证 onDestroy 会被调用,这对我来说实际上不是问题。虽然我想知道为什么 Android 文档没有明确说明这一点。
android android-ndk application-lifecycle activity-lifecycle android-camera-intent
我想通过点击后退按钮退出程序时执行一些功能.这现在由onDestroy()完成,它在每种情况下都有效但只有一个.在退出程序的某些情况下从另一个活动返回时,不会调用onDestroy.
我知道理论上onDestroy应该只在Android因内存不足而关闭应用程序时调用,但对我来说,onDestroy始终工作,并且只在非常特殊的情况下不会.
使用onPause或onStop不起作用,因为我只想在程序退出时调用该函数,而不是在调用另一个活动时调用该函数.
那么抓住后退按钮单击并在那里调用函数的最后一种方法是什么?或者还有其他解决方案吗?
我对nexus 5中的活动生命周期有疑问.当我回到之前的活动onCreate()方法调用上一个活动.通常,它应该在返回上一个活动时调用onStart()方法.
在其他设备与Android 4.3或更低版本我没有看到任何这样的行为.
在清单文件中我定义了
android:configChanges="keyboardHidden|orientation|screenSize"
Run Code Online (Sandbox Code Playgroud)
适用于所有活动.
它是关于android 4.4.2以及如何解决它的东西?
我正在研究Android应用程序.当我的应用程序运行并按下手机上的最近应用程序按钮时,将调用Activity的onPause()方法.在这个onPause里面我调用了finish().所以活动被破坏了.
但它在最近的应用程序列表中仍然可见.
当我从onPause()中销毁我的活动时,如何确保它未列在最近的应用程序列表中.
xml android activity-lifecycle android-recents android-studio