我正在使用Otto Event总线订阅ListFragment中的某些事件.总线实例在Application的子类中存储和创建,换句话说,它应该作为单例工作.看来这不是一个案例......
该片段正在注册到总线onActivityCreated(Bundle)并取消注册onDestroy().这不起作用.我从调用应用程序崩溃的设备获得了几个崩溃报告unregister()(java.lang.IllegalArgumentException:缺少注释方法的事件处理程序......).如果unregister()在调用register()之前调用,或者unregister()调用两次,则抛出此异常.这可能只发生在......
onActivityCreated(Bundle)之前没有打过电话onDestroy().onDestroy() 被叫两次.Application实例调用之间重建onActivityCreated(Bundle)和onDestroy().我的应用类:
public class App extends Application {
private static App sInstance;
private Bus bus;
public static App getInstance() {
return sInstance;
}
@Override
public void onCreate() {
super.onCreate();
sInstance = this;
bus = new Bus(ThreadEnforcer.ANY);
}
public Bus getEventBus() {
return bus;
}
}
Run Code Online (Sandbox Code Playgroud)
Fragment类:
public class MyFragment extends ListFragment {
@Override
public void …Run Code Online (Sandbox Code Playgroud) android activity-lifecycle android-fragments otto fragment-lifecycle
通常在C或C++程序中,通常有一个主循环/函数int main ().我可以在android Java开发中使用类似的功能吗?
我正在努力了解一个活动的完整生命周期.
所以我在Google上搜索并发现了很多关于活动生命周期的教程,但在所有教程中我都没有在生命周期图中找到这些方法:
1.2 OnContentChanged()
. OnPostCreate()
3. OnPostResume()
4. OnWindowfocusChanged()
5. OnuserLeaveHint()
6. OnUserInteraction()
7.OnDetachedFromWindow()
我想知道为什么这些方法不包含在android docs的活动生命周期图中.
还有一个问题:
当第一次创建一个活动时,系统调用该OnContentChanged()方法作为第一种方法,系统最后一次调用是OnDetachedFromWindow()一个活动被杀死的方法,但是android文档说活动的整个生命周期发生在OnCreate()和之间OnDestroy()?
android activity-lifecycle android-lifecycle android-activity
据我了解,被销毁的活动并不等同于正在完成的活动.
那么如何完成被破坏的活动呢?该finish()方法需要一个Activity对象,但如果活动被销毁,我没有Activity对象 - 我不应该持有对被破坏活动的引用,是吗?
案例分析:
我有一个活动a,它开始b,然后开始c(使用Activity.startActivity()),所以现在后面的堆栈是:
a ? b ? c
Run Code Online (Sandbox Code Playgroud)
在c,用户填写表单并点击"提交"按钮.使用的远程服务器发出网络请求AsyncTask.任务完成后,我会显示一个祝酒词并通过调用完成活动c.finish().完善.
现在考虑这种情况:
当异步任务正在进行时,用户切换到另一个应用程序.然后,Android操作系统决定销毁所有3个活动(a,b,c)由于存储器约束.之后,异步任务完成.现在我该如何完成c?
我尝试过的:
c.finish():
c被摧毁了.b.finishActivity():
b被摧毁了. …这是关于POST-honeycomb(即Android 3.0+),以下引用来自https://developer.android.com/reference/android/app/Activity.html
根据生命周期,onStop和onDestroy是可以杀死的,这意味着:
请注意上表中的"Killable"列 - 对于那些标记为可填充的方法,在该方法返回之后,托管该活动的进程可能在任何时候被系统杀死而不执行其代码的另一行
换句话说,的onStop(沿此事件之前发生的其他人)是保证被调用,但此刻的方法返回时,过程可能会死,所以的onDestroy是不能保证被调用.
另一句话说:
对于那些未标记为可填充的方法,系统不会从调用方法开始并在返回后继续执行活动的进程.
其次是
因此,活动处于可填充状态,例如,在onPause()之后到onResume()的开始之间.
但这并不符合什么上面所说的,除非这只相当于预蜂窝.对于POST蜂窝,情况并非如此,对吧?所以基本上,onPause和onStop都可以保证被调用.
假设我只在onDestroy中释放一个资源,那么这可能会导致泄漏,因为可能不会调用onDestroy,对吧?
然而,可以在此情况下(即的onDestroy不叫)出现,除了当过程由机器人本身被杀?是否有任何其他方案导致不调用onDestroy,从而泄漏资源.
当Android杀死资源将被破坏并且不会发生泄漏(即使我们没有明确释放资源吗?)这是真的吗?
请提供详细资料,说明这些陈述(1)(2)(3)(4)(5)是否正确.
通常,通过调用退出我的应用程序:
android.os.Process.killProcess(android.os.Process.myPid());
Run Code Online (Sandbox Code Playgroud)
表现良好而没有事故.
但每隔一段时间,应用程序将重新启动(退出后!).
相关的日志片段显示:
.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 uid=10077 gids={3003}
Run Code Online (Sandbox Code Playgroud)
我知道,通过Android OS的设计,killProcess()不是终止应用程序的正确方法.这是因为killProcess()会立即停止进程,而不会给予应用程序阻止或准备它的任何方式或机会.
我知道当我调用finish()时,应用程序堆栈只是被推到后台(并且仍然存在于内存中).Android本身决定何时关闭应用程序(即从内存中删除其实例),通常这是在应用程序变为"最长时间未使用的最长时间"时完成的.如果它真的是最后一个,它的行为实际上更容易预测.
问题是finish()只会停止并销毁调用它的活动.它不会阻止应用程序或其他活动产生的其他活动.因此,为了便于在开发过程中进行测试和调试,我使用 killProcess()作为方便的快捷方式.
但是现在我看到这有副作用,有时候会在自杀之后立即重新启动 - …
android activity-lifecycle android-windowmanager android-activity
我正在学习一门课程的Android编程,我有一个关于finish()如何适应Activity生命周期的快速问题.
当你调用finish()时,会启动什么生命周期回调?我认为它是onPause(),然后是onStop()和onDestroy().它是否正确?
真的,我只是想确保它不会直接跳到onDestroy().
有两个按钮,按钮A使用简单的Activity.startActivity()方法在其onClickListener中启动另一个活动,按钮B在其onClickListener中执行其他一些工作.
当我单击按钮B并紧接在按钮A之后,然后启动新活动,触发旧活动的onPause()生命周期事件,但是触发第二个按钮的onClick事件,但是在Activity.onPause()之后导致某些状态我的应用程序中的不一致.
有没有办法阻止触摸/点击事件在onPause()之后传递而不使用isPaused标志?
**编辑:**我的代码:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button buttonA = (Button) findViewById(R.id.activity_button);
buttonA.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, TestActivity.class));
}
});
Button buttonB = (Button) findViewById(R.id.log_button);
buttonB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("TEST", "onClick");
}
});
}
@Override
protected void onPause() {
super.onPause();
Log.e("TEST", "onPause");
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,如果你足够快,并在按钮A后面点击按钮B,那么在onPause之后会触发B的onClick.
我正在努力使我们的视频应用程序支持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()在这种情况下获得回调.这类案件是否有适当的解决方法?
在我的Android应用程序中,我有两个活动:
DemoActivity用一个按钮启动SearchActivity一个IntentSearchActivity该按钮是一个自定义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);
}
}
// ...
Run Code Online (Sandbox Code Playgroud)
事件消耗如下:
// ...
@Override
public void onActivityStarted(Activity activity) {
if (activity instanceof SearchActivity) {
SearchActivity searchActivity = (SearchActivity) activity;
searchActivity.addSomeListener(someListener);
}
}
@Override
public void onActivityStopped(Activity activity) {
if (activity instanceof SearchActivity) {
SearchActivity searchActivity = …Run Code Online (Sandbox Code Playgroud)