Articles of android lifecycle

从onContextItemSelected显示的DialogFragment不会在onPause / onResume中生存

我有一个DialogDragment,我可以显示以下两种方法之一: 1)通过点击OnItemClickListener中的ListView项目 2)通过激活ListView的上下文菜单并select一个菜单项 在所有生命周期事件中,#1都能正常工作,但是如果我通过#2调用它,并暂停活动(通过回家)并通过任务切换器恢复活动,则不再显示该对话框。 片段在那里,我可以旋转设备并显示对话框。 我进行了实验,如果将DialogFragment的显示延迟至less1/2秒,就可以工作。 以下片段失败 – 显示对话框,但暂停/恢复隐藏它: public boolean onContextItemSelected(android.view.MenuItem item) { boolean consumed = false; switch (item.getItemId()) { case R.id.menu_item: showMyDialogFragment(); consumed = true; break; } return consumed; } 所以下面的代码片段工作。 暂停/继续再次正确显示对话框: public boolean onContextItemSelected(android.view.MenuItem item) { boolean consumed = false; switch (item.getItemId()) { case R.id.menu_item: new Handler().postDelayed(new Runnable() { public void run() […]

savedInstanceState vs getIntent()。getExtras()

我遇到了两种不同的types,让我的活动基于一些参数运行。 第一个是savedInstanceState ,另一个是getIntent.getExtras() Q1)所以我不明白的是,一旦我把捆绑到我的活动,然后开始,它应该有捆绑。 但是,如果由于某种原因再次重新创build活动,则应该重新包装相同的包。 (我对吗?) Q2)基于事实Q1是真实的,事实上,我不能只是一旦活动已经开始重写捆绑,我猜如果由于某种原因在我已经开始的活动,我想改变一些params的捆绑,我应该创build一些活动领域,并在我的活动生活中使用这些领域。 并重写saveInstanseState保存新的字段,如果由于某种原因我的活动将被重新创build。 这是真的吗? Q3)基于以上事实,在onCreate()中,Android的世界中的每一个活动都需要像这样开始: if (savedInstanceState != null) { mType = savedInstanceState.getInt("some_val1"); mCardId = savedInstanceState.getLong("some_val2"); mQuery = savedInstanceState.getString("some_val3"); mCategory = savedInstanceState.getLong("some_val4");; } else { mType = getIntent().getExtras().getInt("some_val1"); mCardId = getIntent().getExtras().getLong("some_val2"); mQuery = getIntent().getExtras().getString("some_val3"); mCategory = getIntent().getExtras().getString("some_val4"); } Q4)假设onSaveInstanceState被调用并保存了与启动该活动的原始包(getIntent.getExtras)不同的值,如果再次重新创build活动,这是否意味着saveInstanceState与getIntent.getExtras()不同?现在是一样的吗? (如果它们是相同的,那么上面的代码中的if / else没有真正的含义,因为它是相同的!)。 Q5)如果我没有重写onSaveInstanceState,但是当我创build活动时,我把它传递给一个Bundle,这是否意味着如果活动再次被重新创build,我可以得到我的原始包? (我猜这个问题会根据其他答案自行回答)

Android服务能否超越应用程序对象?

所以,这个问题是非常明显的。 如果Service 不在另一个进程中启动,可以自定义Application对象(我在AndroidManifest.xml声明的那个)被销毁吗? 我的直觉说这是不可能的,因为我们可以通过调用getApplication()来访问Service的Application对象,再加上我在文档中没有看到类似的东西,但是Android充满了意想不到的有趣行为。

IllegalArgumentException使用Otto保留片段

我正在使用Otto 1.3.3 ,当我恢复我的应用程序有时我得到一个IllegalArgumentException以下stacktrace: Caused by: java.lang.IllegalArgumentException: Producer method for type class com.couchsurfing.mobile.ui.setup .SessionProviderFragment$SessionConnectionStateChangeEvent found on type class com.couchsurfing.mobile.ui.setup.SessionProviderFragment, but already registered by type class com.couchsurfing.mobile.ui.setup.SessionProviderFragment. at com.squareup.otto.Bus.register(Bus.java:194) at com.couchsurfing.mobile.ui.BaseRetainedFragment .onCreate(BaseRetainedFragment.java:20) SessionProviderFragment保留实例,请在扩展类下面find: public abstract class BaseRetainedFragment extends SherlockFragment { @Inject Bus bus; @Override public void onCreate(final Bundle state) { super.onCreate(state); ((CouchsurfingApplication) getActivity().getApplication()).inject(this); setRetainInstance(true); bus.register(this); } @Override […]

保存按下后退button时的状态

我正在开发一个Android应用程序。 如果我按下后退button应保存我的应用程序的状态。我应该用什么来保存状态..AM所有这些onPause() , onResume()或onRestoresavedInstance() ??? 我应该使用哪些应用程序来保存应用程序的状态? 例如,当我按下退出button,我的整个应用程序应该退出我用完()? public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); s1=(Button)findViewById(R.id.sn1); s1.setOnClickListener(this); LoadPreferences(); s1.setEnabled(false); } public void SavePreferences() { SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putBoolean("state", s1.isEnabled()); } public void LoadPreferences() { System.out.println("LoadPrefe"); SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE); Boolean state = sharedPreferences.getBoolean("state", false); s1.setEnabled(state); } @Override public void onBackPressed() { […]

尽可能防止活动被破坏

我有一个应用程序,一个单一的活动应用程序与片段。 这个应用程序的通常使用情况是,你启动它,并把电话远离,然后,你回到手机,并插入一些数据…这是一个日志应用程序,你正在做的事情,并插入你的结果进入应用程序… 我有这个问题,我的活动会不时被破坏,并重新创build一个空的捆绑…(大多数情况下,情况并非如此,但偶尔会发生这种情况…)。 我的应用程序有时启动服务,即使这种服务在这种情况下被杀害… 这意味着,系统已经杀了我的应用程序,是吗? 我怎样才能避免这一点? 我需要保留用户数据和当前的最高碎片…并将它们保存到捆绑包中,只要其状态和数据得到保存,一切都会正常工作。 顺便说一下,我的活动总是最活跃的,只有屏幕closures经常…我只是想保持我的活动尽可能长时间,直到用户离开后退button…或保存状态可靠 重要的提示 onSaveInstance不总是工作(这不是生命周期的一部分,因此不保证被调用)…它只能在大多数时间…我需要一种方式,总是工作…如果android杀死我的应用程序。 ..

在Broadcast Receiver中访问应用程序类

我想检查广播接收器中的互联网连接; 并将结果(一个布尔标志)设置为一个全局variables,在整个应用程序中使用它,在if条件下; 如果互联网断开连接,请将主要活动中的状态图像视图设置为红色图像,如果连接,则将其设置为绿色。 我跟着这个话题。 但在Broadcast Receiver中没有getApplication() ; 而我应该使用getApplicationContext()来代替。 另一方面, 这个话题: 当在广播接收器中编写代码时,它不是一个上下文,而是在onReceive方法中给定一个上下文,只能调用getApplicationContext()。 这也意味着您不能保证在BroadcastReceiver中访问您的应用程序。 有什么担忧? 如何在广播Receiver中访问我的应用程序类? 有没有更好的解决scheme来检查互联网连接,设置全局variables,并改变我的状态imageview?

如何保留从片段打开的自定义对话框的监听器?

我遇到了一些障碍。 我有一个非常类似于以下所述的场景: DialogFragment – 屏幕旋转后保留监听器 build议的解决scheme适用于作者,因为他的对话框是从一个活动中调用的。 我的情况是完全一样的,但我的自定义对话框是从一个片段调用,而不是一个活动。 (IE Activity-> Fragment-> Dialog) 我实现了相同的解决scheme(在调用Fragment的onResume中设置监听器),但在这种情况下不起作用。 似乎正在发生的事情是,当屏幕旋转,Android杀死对话框和片段。 然后在那个命令中重新创build它们。 所以当我的自定义对话框上调用了onCreateDialog时,包含的Fragment还没有被重新创build,所以对于侦听器来说,它设置为正和负的button。 有没有人知道这个方法? 如果有人认为这是必要的,我可以发布代码,但它与链接线程上的代码非常相似。 用代码更新: public class RecipeDetailEditFragment extends SherlockFragment implements DialogInterface.OnClickListener { private EditStepFragmentDialog stepDialog; private Recipe newRecipe; //main data object implements parcelable … public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); … stepDialog = EditStepFragmentDialog.newInstance(newRecipe); //I've also tried passing 'this' into the […]

是在布局包含视图的活动被重新创build时恢复的视图的“标记”?

有关Activity娱乐状态的文档 : 默认情况下,系统使用Bundle实例状态来保存活动布局中每个View对象的信息(如input到EditText对象中的文本值)。 所以,如果您的活动实例被销毁并重新创build,那么布局的状态将恢复到之前的状态,不需要代码。 View.setTag(Object)状态的文档 : 设置与此视图关联的标签。 标签可以用来在其层次结构中标记视图,而不必在层次结构中是唯一的。 标签也可以用来在一个视图内存储数据而不需要借助另一个数据结构。 我的问题是:如果我在一个视图(具有唯一的ID)在我的活动的布局设置标签,然后该活动被系统销毁,随后重新创build,将重新创build时,该视图自动标记我最初设定的对象?

OnPause()或onStop()是否即使电话由于电量不足而死机?

例如,如果我需要保留用户可以在我的应用程序中编辑的一些非常重要的数据,那么每当用户更改此类数据时是否需要保存它们,或者如果将它保存在onPause(),onStop() )或onDestroy()方法? 可以以某种方式结束没有任何这些方法调用? (例如电池耗尽时)