我正在学习一门课程的Android编程,我有一个关于finish()如何适应Activity生命周期的快速问题.
当你调用finish()时,会启动什么生命周期回调?我认为它是onPause(),然后是onStop()和onDestroy().它是否正确?
真的,我只是想确保它不会直接跳到onDestroy().
我正在努力使我们的视频应用程序支持Android N多窗口模式.我发现活动生命周期在多窗口模式下变得混乱.这种现象是当我们的应用程序布局在顶部屏幕上,整个屏幕是纵向的,然后我点击主页按钮,上层应用程序onPause()调用但未onStop()调用.
根据谷歌指南https://developer.android.com/guide/topics/ui/multi-window.html#lifecycle,视频应用应该在onStop()回调而不是onPause()回调中暂停视频播放.
在这种情况下,按下主页按钮,活动进入后台并变得对用户不可见,我们的应用程序应暂停视频播放但我们无法获得onStop()回调.同时,活动不会触发onMultiWindowChanged()回调,这意味着活动仍处于多窗口模式,尽管它处于后台.在isInMultiWindowMode()将返回true在这种情况下.
当应用程序位于左侧屏幕且整个屏幕处于横向状态时,将出现同样的问题.
我已经搜索了这个问题,发现有人在谷歌上发布了问题,但未在Android Nougat版本中处理.
那么,什么时候才能在这种情况下暂停我们的视频播放?如果我们在onPause()回调中暂停视频,但在多窗口模式下用户可以看到该活动.如果我们不这样做,我们就无法onStop()在这种情况下获得回调.这类案件是否有适当的解决方法?
我的应用程序由一个单独组成Activity.在这个活动中,我正在创建多个HandlerThreads,它们在循环中运行以执行套接字阻塞操作.
目前我HandlerThread在我的期间向这些人发布了一条戒烟信息Activity.onDestroy().
有时,当我打开我的应用程序,关闭它并重新启动它时,它会崩溃(很多时候是由于向未运行的处理程序线程发送消息).
我的问题是:关闭我的应用程序时关闭的正确方法HandlerThread是什么?(请注意,那些线程可能在套接字操作上阻塞).
编辑:更多信息: 我有一个处理程序线程池,它是在onCreate中启动的(当我第一次启动我的应用程序时没问题).
每个处理程序runnable循环都包含一个
if (shouldRun) {
//body
}
else {
close();
}
Run Code Online (Sandbox Code Playgroud)
声明.
close方法删除所有挂起的消息和runnables,并向处理程序发送一条消息,使其调用它looper.quit().这样,如果当前处理程序线程被IO操作阻止,只有一旦它完成它,他将退出().
我读过的所有内容都说您不能在构造函数中调用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
我试图准确研究何时为一项活动调用onDestroy方法,但我已经阅读了一些令人困惑和冲突的信息.一般来说,我的问题是:在什么情况下onDestroy方法实际上调用了一个活动?更具体地说,如果我有两个活动,即活动A和活动B,如果活动A正在运行并且我创建了一个意图并切换到活动B,那么活动A是仅停止还是被销毁?
我遇到了一个要求,但我无法得到正确的实施方式,因此需要你的帮助.
我想做的事? - 我想根据我得到的通知执行操作如下:
我做了什么?我已经取得了第一点和第二点.我想达到第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) 我想将 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的默认流调用活动的各个onSaveInstanceState,onStop,onDestroy释放参考之前方法Activity的对象.
然而,似乎我有一个案例,当我的应用程序在后台,活动被杀死而没有调用那些方法,但我的应用程序本身不会被破坏.
但是我无法强制重现这一点.每当我在前台使用需要大量资源的应用程序时,整个过程都会被杀死,而不仅仅是活动.
哪种让我感到惊讶,因为我认为低资源上的'app kill'基本上只是旧的信号方式,Android系统是否会在不调用这些方法的情况下立即"杀死"(释放)一项活动?还是我在追逐鬼魂?
在视图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
我陷入了僵局.我正在使用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 ×10
android-room ×1
android-task ×1
android-view ×1
animation ×1
dagger-2 ×1
multi-window ×1
state ×1