Articles of activity lifecycle

当直接从通知启动活动时,如何构建Android后备栈?

我有两个活动: 活动A – 项目清单 活动B – 项目的详细视图 通常,用户打开应用程序并启动活动A. 用户查看项目列表,单击一个项目,然后启动活动B以显示项目详细信息。 也可以通过单击通知直接启动活动B. 在这种情况下,没有后栈。 如何才能使活动B直接从通知启动时,用户可以单击“返回”按钮并转到活动A?

当活动停止时,Dagger 2保存并恢复状态

我陷入了僵局。 我使用Dagger 2进行dependency injection,但当应用程序进入后台时,我正在丢失状态。 这是情景:应用程序启动并创build依赖关系。 只要应用程序停留在前台,所有的工作都是完美的。 但是,有一种情况下,应用程序必须进入后台。 当它回来时,存储在我的一个注入类中的值将丢失。 对于我的注入类没有自己的依赖,一切似乎恢复正常。 但是,有一个注入类有一个注入依赖,这是不能恢复的类。 以下是我如何设置它: AppComponent.java @Singleton @Component( modules = { AppModule.class } ) public interface AppComponent { SessionKeyExchangerService provideSessionKeyExchangerService(); AESCipherService provideCipherService(); void inject(LoginActivity loginActivity); } AppModule.java @Module public class AppModule { @Provides @Singleton AESCipherService provideCipherService() { return new AESCipherService(); } @Provides @Singleton SessionKeyExchangerService provideSessionKeyExchangerService(AESCipherService service) { return new […]

BufferQueue已被放弃:当使用TextureView播放video时

每当我暂停我的活动(实际上是Fragment)去另一个应用程序,一旦返回onResume我尝试恢复video播放,但它不播放:我得到一个空白的屏幕。 经过调查,我在Logcat中看到以下内容 E/BufferQueueProducer: [unnamed-23827-0] queueBuffer: BufferQueue has been abandoned E/MediaPlayer: error (1, -38) E/MediaPlayer: error (1, -38) E/MediaPlayer: error (1, -38) E/MediaPlayer: error (1, -38) E/BufferQueueProducer: [unnamed-23827-0] connect(P): BufferQueue has been abandoned 这里是我在简历中调用的代码 player.seekTo(mVideoSeekPosition); player.start(); 仅供参考:我一直在尝试将这个答案应用于我的案例,但是我不能: 当BufferQueue被放弃时我该怎么办? UPDATE 我努力独自一人,但我仍然崩溃。 所以我张贴整个代码的帮助 private void setupVideoPlayingSystem(View root) { textureView = (TextureView) root.findViewById(R.id.textureView); textureView.setSurfaceTextureListener(this); } @Override public void onSurfaceTextureAvailable(SurfaceTexture […]

finish()和Activity的生命周期

我正在学习一个类的Android编程,我有一个关于finish()如何适应Activity生命周期的简单问题。 当你完成一个调用(),什么生命周期callback开始? 我认为它是onPause(),然后onStop()和onDestroy()。 它是否正确? 真的,我只是想确保它不会直接跳到o​​nDestroy()。

我应该手动closures由我的应用程序创build的HandlerThreads在销毁活动?

我的应用程序是由一个单一的Activity 。 在这个活动中,我创build了多个在循环中运行的HandlerThread ,以执行套接字阻塞操作。 目前,我在Activity.onDestroy()期间向这些HandlerThread的每个人发布了一条退出消息。 有时,当我打开我的应用程序,closures它,并重新启动,它崩溃(很多时间,因为发布一个消息处理程序线程不运行)。 我的问题是: closures我的应用程序时closuresHandlerThread的正确方法是什么? (请注意,这些线程可能会阻塞套接字操作)。 编辑:更多信息:我有一个处理程序线程池,这是在onCreate(当我第一次启动我的应用程序时没有问题)启动。 每个处理程序的可运行循环都包含一个 if (shouldRun) { //body } else { close(); } 声明。 close方法移除所有待处理的消息和可运行参数,并向处理程序发送消息,使其调用其looper.quit() 。 这样,如果当前处理程序线程被IO操作阻塞,只有一次它将完成它将退出()。

当活动通过“不保留活动”被终止时,ActivityLifecycleCallbacks不被触发

在我的Android应用程序中,我有两个活动: 带一个button的SearchActivity用Intent启动SearchActivity SearchActivity 该button是一个自定义的ViewGroup: SearchButton 只要SearchButton进入生命周期,它就注册生命周期事件(相应的SearchActivity ): public class SearchButton extends CardView implements Application.ActivityLifecycleCallbacks { @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); Context applicationContext = getContext().getApplicationContext(); if (applicationContext instanceof Application) { ((Application) applicationContext) .registerActivityLifecycleCallbacks(this); } } // … 事件消耗如下: // … @Override public void onActivityStarted(Activity activity) { if (activity instanceof SearchActivity) { SearchActivity searchActivity = (SearchActivity) […]

Android应用程序,活动状态(正在运行,未运行,前景/背景)

我遇到了一个要求,但我无法得到正确的实施方式,因此需要您的帮助。 我想做的事? – 我想根据通知执行操作,如下所示: 当应用程序是开放的,在前台,即对用户可见,我得到通知,我只是显示一个popup窗口,启动我的活动B 当应用程序closures,即不在后台和前台,我得到的通知,我将开始我的申请,然后开始活动乙 当应用程序正在运行,但在后台,即最近,但对用户不可见,那么我想启动我的活动B,而无需重新启动应用程序。 而且,在这种情况下,当用户按下活动B时,他们应该看到他们的屏幕,然后发送到后台。 我做了什么? 我已经达到了第一点和第二点。 我想要达到第三点。 我已经尝试了下面 public static boolean isApplicationBroughtToBackground(final Activity activity) { ActivityManager activityManager = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(1); // Check the top Activity against the list of Activities contained in the Application's package. if (!tasks.isEmpty()) { ComponentName topActivity = tasks.get(0).topActivity; try { PackageInfo pi = […]

在Android N多窗口模式下按下主页button时,未调用Activity onStop()

我正试图让我们的video应用程序支持Android N多窗口模式。 我发现活动生命周期在多窗口模式下变得混乱。 这种现象是当我们的应用程序在屏幕上的整个屏幕纵向布局,然后我点击主页button,上面的应用程序onPause()调用,但onStop()没有调用。 根据谷歌指南https://developer.android.com/guide/topics/ui/multi-window.html#lifecycle ,video应用程序应暂停在onStop()callback,而不是onPause()callbackvideo播放。 在这种情况下,主页button被按下,活动变为背景,对用户不可见,我们的应用程序应该暂停video播放,但我们不能得到onStop()callback。 同时,活动不会触发onMultiWindowChanged()callback,这意味着活动仍然处于多窗口模式,尽pipe它在后台。 在这种情况下, isInMultiWindowMode()将返回true 。 当应用程序在左侧屏幕中,整个屏幕处于横向时,将发生同样的问题。 我已经search了这个问题,并发现有人有alreay发布谷歌,但没有在Android Nougat发布处理。 https://code.google.com/p/android/issues/detail?id=215650&can=1&q=multi%20window%20onstop&colspec=ID%20Status%20Priority%20Owner%20Summary%20Stars%20Reporter%20Opened 那么,在这种情况下,什么时候该暂停我们的video播放呢? 如果我们在onPause()callback中暂停video,但在多窗口模式下用户可以看到该活动。 如果我们不这样做,在这种情况下,我们无法获得onStop()callback。 有这种情况下的一些适当的解决方法?

为什么应用程序有时会重新启动killProcess?

通常,通过拨打我的应用程序退出: android.os.Process.killProcess(android.os.Process.myPid()); performance不错。 但每过一段时间,应用程序将重新启动(退出后!)。 相关的日志片段显示: .631: I/Process(15495): Sending signal. PID: 15495 SIG: 9 .641: W/AudioFlinger(121): write blocked for 252 msecs, 1279 delayed writes, thread 0xdc18 .651: I/ActivityManager(164): Process com.ef.myapp (pid 15495) has died. .651: I/WindowManager(164): WIN DEATH: Window{463659e8 com.ef.myapp/com.ef.myapp.MainActivity paused=false} .661: I/AudioService(164): AudioFocus abandonAudioFocus() from android.media.AudioManager@460b2b98 .701: I/ActivityManager(164): Start proc com.ef.myapp for activity com.ef.myapp/.MainActivity: pid=15589 […]

当一个活动直接从通知开始时,如何build立一个Android的后退堆栈?

我有两个活动: 活动A – 项目列表 活动B – 项目的详细视图 通常情况下,用户打开应用程序,活动A启动。 用户看到一个项目列表,点击一个,活动B开始显示项目详细信息。 活动B也可以通过点击通知直接启动。 在这种情况下,没有后备堆栈。 我如何做到这一点,以便当直接从通知开始活动B时,用户可以单击后退button并转到活动A?