标签: activity-lifecycle

finish()和Activity生命周期

我正在学习一门课程的Android编程,我有一个关于finish()如何适应Activity生命周期的快速问题.

当你调用finish()时,会启动什么生命周期回调?我认为它是onPause(),然后是onStop()和onDestroy().它是否正确?

真的,我只是想确保它不会直接跳到o​​nDestroy().

android activity-lifecycle android-activity

10
推荐指数
2
解决办法
3万
查看次数

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

我正在努力使我们的视频应用程序支持Android N多窗口模式.我发现活动生命周期在多窗口模式下变得混乱.这种现象是当我们的应用程序布局在顶部屏幕上,整个屏幕是纵向的,然后我点击主页按钮,上层应用程序onPause()调用但未onStop()调用.

根据谷歌指南https://developer.android.com/guide/topics/ui/multi-window.html#lifecycle,视频应用应该在onStop()回调而不是onPause()回调中暂停视频播放.

在这种情况下,按下主页按钮,活动进入后台并变得对用户不可见,我们的应用程序应暂停视频播放但我们无法获得onStop()回调.同时,活动不会触发onMultiWindowChanged()回调,这意味着活动仍处于多窗口模式,尽管它处于后台.在isInMultiWindowMode()将返回true在这种情况下.

当应用程序位于左侧屏幕且整个屏幕处于横向状态时,将出现同样的问题.

我已经搜索了这个问题,发现有人在谷歌上发布了问题,但未在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

那么,什么时候才能在这种情况下暂停我们的视频播放?如果我们在onPause()回调中暂停视频,但在多窗口模式下用户可以看到该活动.如果我们不这样做,我们就无法onStop()在这种情况下获得回调.这类案件是否有适当的解决方法?

android multi-window activity-lifecycle android-7.0-nougat

10
推荐指数
1
解决办法
1047
查看次数

我应该在销毁活动时手动关闭由我的应用程序创建的HandlerThreads吗?

我的应用程序由一个单独组成Activity.在这个活动中,我正在创建多个HandlerThreads,它们在循环中运行以执行套接字阻塞操作.

目前我HandlerThread在我的期间向这些人发布了一条戒烟信息Activity.onDestroy().

有时,当我打开我的应用程序,关闭它并重新启动它时,它会崩溃(很多时候是由于向未运行的处理程序线程发送消息).

我的问题是:关闭我的应用程序时关闭的正确方法HandlerThread什么(请注意,那些线程可能在套接字操作上阻塞).

编辑:更多信息: 我有一个处理程序线程池,它是在onCreate中启动的(当我第一次启动我的应用程序时没问题).

每个处理程序runnable循环都包含一个

 if (shouldRun) {
//body
} 
else { 
 close();
}
Run Code Online (Sandbox Code Playgroud)

声明.

close方法删除所有挂起的消息和runnables,并向处理程序发送一条消息,使其调用它looper.quit().这样,如果当前处理程序线程被IO操作阻止,只有一旦它完成它,他将退出().

android activity-lifecycle android-handler

9
推荐指数
1
解决办法
8388
查看次数

为什么在onResume()的View上调用getWidth()返回0?

我读过的所有内容都说您不能在构造函数中调用getWidth()getHeight()在上调用View,但我在中调用它们onResume()。届时是否应该绘制屏幕布局?

@Override
protected void onResume() {
    super.onResume();

    populateData();
}

private void populateData() {
    LinearLayout test = (LinearLayout) findViewById(R.id.myview);
    double widthpx = test.getWidth();
}
Run Code Online (Sandbox Code Playgroud)

android android-layout activity-lifecycle android-view android-viewtreeobserver

9
推荐指数
2
解决办法
2559
查看次数

onStop vs onDestroy

我试图准确研究何时为一项活动调用onDestroy方法,但我已经阅读了一些令人困惑和冲突的信息.一般来说,我的问题是:在什么情况下onDestroy方法实际上调用了一个活动?更具体地说,如果我有两个活动,即活动A和活动B,如果活动A正在运行并且我创建了一个意图并切换到活动B,那么活动A是仅停止还是被销毁?

android activity-lifecycle android-activity

9
推荐指数
1
解决办法
1万
查看次数

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

我遇到了一个要求,但我无法得到正确的实施方式,因此需要你的帮助.

我想做的事? - 我想根据我得到的通知执行操作如下:

  1. 当应用程序打开并处于前台时,即用户可见,我收到通知,我只需显示一个弹出窗口即可启动我的活动B.
  2. 当应用程序关闭时,即无论是在后台还是在前台,我都会收到通知,我将首先启动我的应用程序然后启动活动B.
  3. 当应用程序在后台运行时,即在最近但用户不可见时,我想启动我的活动B而不重新启动应用程序.此外,在这种情况下,当用户按下活动B时,他们应该在将其发送到后台之前看到他们停止的屏幕.

我做了什么?我已经取得了第一点和第二点.我想达到第3点.我试过以下

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 = activity.getPackageManager().getPackageInfo(activity.getPackageName(), PackageManager.GET_ACTIVITIES);
      for (ActivityInfo activityInfo : pi.activities) {
        if(topActivity.getClassName().equals(activityInfo.name)) {
          return false;
        }
      }
    } catch( PackageManager.NameNotFoundException e) {
      return false; // Never happens.
    }
  }
  return true;
} …
Run Code Online (Sandbox Code Playgroud)

android activity-lifecycle android-activity android-task

9
推荐指数
1
解决办法
2352
查看次数

Activity 无法转换为 LifecycleOwner

我想将 Room 与 LiveData 一起使用,并且在其他项目中我已经使用过它,但是在这个项目中,我无法让它工作。当我尝试观察实时数据时,它无法将我的活动转换为生命周期活动,但是,我正在使用 AppCompatActivity,我什至尝试覆盖 getLifecycle 方法(在以前的项目中对我有用)。我什至尝试过 AndroidX 但仍然是同样的问题:(

这是我的活动(部分):

import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleRegistry;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;

private LifecycleRegistry mLifecycleRegistry;

public class actMain extends AppCompatActivity  {

 @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mLifecycleRegistry = new LifecycleRegistry(this);
    mLifecycleRegistry.markState(Lifecycle.State.CREATED);
}
  @Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
    //Firebase
    db = FirebaseFirestore.getInstance();

    mLifecycleRegistry.markState(Lifecycle.State.STARTED);

    alarmViewModel = ViewModelProviders.of(this).get(AlarmViewModel.class);

    alarmViewModel.getAlarmList().observe(actMain.class, new 
    Observer<List<Alarm>>() {
        @Override
        public void onChanged(@Nullable List<Alarm> alarms) {

        }
    });
}
@NonNull
@Override
public Lifecycle getLifecycle() {
    return …
Run Code Online (Sandbox Code Playgroud)

android activity-lifecycle android-room android-livedata

9
推荐指数
1
解决办法
8784
查看次数

Android可以"杀死"活动而不会杀死应用程序吗?

我们知道,这样的场景在Android的默认流调用活动的各个onSaveInstanceState,onStop,onDestroy释放参考之前方法Activity的对象.

然而,似乎我有一个案例,当我的应用程序在后台,活动被杀死而没有调用那些方法,但我的应用程序本身不会被破坏.

但是我无法强制重现这一点.每当我在前台使用需要大量资源的应用程序时,整个过程都会被杀死,而不仅仅是活动.

哪种让我感到惊讶,因为我认为低资源上的'app kill'基本上只是旧的信号方式,Android系统是否会在不调用这些方法的情况下立即"杀死"(释放)一项活动?还是我在追逐鬼魂?

android activity-lifecycle android-activity

8
推荐指数
1
解决办法
1890
查看次数

活动开始时的动画会跳过帧

在视图onGlobalLayoutFinished上调用后,我在活动中设置视图的动画.我的动画在开始时跳过~300 ms的帧.如果我将动画延迟超过300毫秒,它不会跳过任何帧.导致这种情况发生的活动是怎么回事?我怎么能阻止它或者我怎么能听完呢?

我创建了一个简单的死应用来演示这种行为.

<application>AndroidManifest.xml中的内容:

<activity
    android:name=".main.TestLagActivity"
    android:label="Test Lag Activity">
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)

TestLagActivity.java:

public class TestLagActivity extends ActionBarActivity { 
  private View mRedSquareView;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test_lag);

    mRedSquareView = findViewById(R.id.activity_test_lag_redSquareView);

    if (mRedSquareView.getViewTreeObserver() != null) {
      mRedSquareView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        public void onGlobalLayout() {
          mRedSquareView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
          animate();
        }
      });
    }
  }

  private void animate() {
    ObjectAnimator xAnimator = ObjectAnimator.ofFloat(mRedSquareView, "x", 0, 1000);
    xAnimator.setDuration(1000);
    xAnimator.start();
  }
}
Run Code Online (Sandbox Code Playgroud)

activity_test_lag.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout …
Run Code Online (Sandbox Code Playgroud)

animation android android-layout activity-lifecycle android-activity

8
推荐指数
1
解决办法
1112
查看次数

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

我陷入了僵局.我正在使用Dagger 2进行依赖注入,但是当应用程序进入后台时,我正在失去状态.这是场景:应用程序启动并创建依赖项.只要应用程序停留在前台,所有功能都可以完美运行.但是,有一种情况是应用程序必须进入后台.当它返回时,存储在我注入的一个类中的值将丢失.

对于我没有自己依赖的注入类,一切似乎都恢复正常.但是,有一个注入类具有注入依赖项,而这是一个无法恢复的类.这是我如何设置它:

AppComponent.java

@Singleton
@Component(
    modules = {
        AppModule.class
    }
)

public interface AppComponent {

    SessionKeyExchangerService provideSessionKeyExchangerService();
    AESCipherService provideCipherService();

    void inject(LoginActivity loginActivity);
}
Run Code Online (Sandbox Code Playgroud)

AppModule.java

@Module
public class AppModule {

    @Provides @Singleton
    AESCipherService provideCipherService() {
        return new AESCipherService();
    }

    @Provides @Singleton
    SessionKeyExchangerService provideSessionKeyExchangerService(AESCipherService service) {
        return new SessionKeyExchangerService(service);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,当我去注入这些依赖项时,我这样做:

LoginActivity.java

@Inject 
SessionKeyExchangerService sessionKeyExchangerService;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    Injector.INSTANCE.getAppComponent().inject(this);

    if (savedInstanceState != null) {
        sessionKeyExchangerService = savedInstanceState.getParcelable(SESSION_KEY_PARCEL);
        Log.d(Constants.TAG, "session key retrieved in on create: " …
Run Code Online (Sandbox Code Playgroud)

android state activity-lifecycle dagger-2

8
推荐指数
1
解决办法
1560
查看次数