片段有一个非常奇怪的问题.我使用最新的支持库.我也使用Google在其IOSCHED项目中使用的类似代码
但是我在轮换后重新创建活动时遇到问题.在销毁并再次创建活动之后,我调用了用于管理片段事务的方法(在onStart方法中).这行只被调用一次,但它创建片段TWICE!
这是我的活动方法:
public abstract class SinglePaneActivity extends FragmentActivity
{
@Override
protected void onStart()
{
super.onStart();
if(mFragment == null)
{
mFragment = onCreatePane();
mFragment.setArguments(Utils.intentToFragmentArguments(getIntent()));
Log.w(TAG, "Fragment creation counter = " + createCounter);
createCounter++;
getSupportFragmentManager()
.beginTransaction()
.add(R.id.root_container,mFragment)
.commit();
}
}
@Override
protected void onStop()
{
Log.i(TAG, "onStop");
if(mFragment != null)
{
getSupportFragmentManager()
.beginTransaction()
.remove(mFragment)
.commit();
mFragment = null;
}
super.onStop();
}
}
Run Code Online (Sandbox Code Playgroud)
和我的日志:
--Start of application--
11-18 13:26:37.050: I/SinglePaneActivity(19040): onCreate
11-18 13:26:37.050: I/SinglePaneActivity(19040): onStart
11-18 13:26:37.055: W/SinglePaneActivity(19040): replacing fragment, …Run Code Online (Sandbox Code Playgroud) lifecycle android fragment android-lifecycle android-activity
所以我有一个活动A和一个活动B.我希望活动A能够通过按下按钮导航到活动B. 这是有效的,但是当我使用向上导航(操作栏中的主页按钮)导航回活动A时,再次调用onCreate()并且用户输入的旧信息将丢失.
我已经看到了:onCreate总是被调用,如果有意图导航,但他们使用Fragments,我希望不必重新设计整个应用程序来使用片段.每次活动A再次变为活动状态时,有什么方法可以阻止onCreate()被调用?
我遇到了与保存我的活动状态相关的问题.我在这里搜索并阅读了很多问题但是我无法得到我的问题的答案.
我有一个ActivityA 2 Fragments.的ActivityA保持其由显示数据Fragments.当我推出一个新的Intent为我设置Activity了Activity一个暂停(不被破坏),onPause()和onSaveInstanceState()方法被调用,所以我救我的所有数据onSaveInstaceState().
当我从我的设置返回时使用后退按钮ActivityA再次显示但是onCreate()没有调用方法因为Activity没有被销毁,而是onResume()方法被调用但是我在ActivityA中丢失了我的变量状态而我无法访问Bundle我保存的onSaveInstanceState()因为onCreate()不叫.
那么onSaveInstanceState()只有在旋转屏幕时才有用吗?如何访问我保存的所有数据onSaveInstanceState()?或者我应该将它们保存到文件中或以后SharedPrefs访问它们onResume()?
我试图弄清楚何时使用已保存的实例状态与从共享首选项文件加载信息.我有两个我希望保存的变量,时间和分数.我想确保如果用户返回到游戏屏幕,他们的分数和时间被保存和恢复,无论它是来自onPause状态还是onStop.
我有三个键:
public static final String ARG_SCORE = "score";
public static final String ARG_TIME = "time";
public static final String SHARED_PREFS = "shared_preferences";
Run Code Online (Sandbox Code Playgroud)
如果游戏暂停并显示一个对话框,那么当用户返回时我应该这样做
public void onRestoreInstanceState(Bundle savedInstanceState){
int score = savedInstanceState.getInt(ARG_SCORE);
}
Run Code Online (Sandbox Code Playgroud)
或者我应该这样做:
protected void onResume(){
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
int score = sharedPref.getInt(getString(R.string.saved_high_score));
}
Run Code Online (Sandbox Code Playgroud)
总的来说,我需要帮助了解生命周期以及何时存储重要信息,例如游戏的时间和分数.我只需要避免用户在无法完成游戏的情况下重新启动.
最后,我假设sharedPrefs保存到xml文件.它是否正确?有没有人有一个样本xml我的sharedPrefs应该如何出现?保存到savedInstanceState包中的密钥是否也存储在xml文件中?如果是这样,任何例子?如果没有,信息存储在哪里?
谢谢!
编辑:
好的酷豆.谢谢!还有一个问题,当为存储在sharedPreferences中的键值对定义键时,例如
public static final String ARG_SCORE = "score";
Run Code Online (Sandbox Code Playgroud)
为什么存储"得分"字符串?什么时候会被使用?我总是使用类似的东西在key_value对中放置一个值
args.putInt(ARG_TIMER, timerINT);
Run Code Online (Sandbox Code Playgroud)
并使用
scoreINT=savedInstanceState.getInt(ARG_SCORE);
Run Code Online (Sandbox Code Playgroud)
为什么键ARG_SCORE需要名称?我什么时候需要这个名字?是否必须保持String类型?
xml android sharedpreferences android-lifecycle onrestoreinstancestate
文档说明了这一点
如果服务当前正在运行且用户已从服务的应用程序中删除了任务,则会调用此方法.
似乎只有当应用程序从最近的任务列表中滑出时才会调用它.按下后退按钮直到Activities任务中的所有内容都被销毁,这不会导致调用它.还有其他情况可以调用吗?
在我的 AndroidStudio 中的 Android 项目中,一个扩展 LifecycleService 的类(下面名为 MyService)标记有以下错误消息:
类“MyService”不是抽象的,并且没有实现抽象基类成员public abstract fun getLifecycle(): Lifecycle 在 androidx.lifecycle.LifecycleService 中定义
但是使用 Gradle 构建很好,当我导航到 LifecycleService 类时,它既不是抽象的,也没有缺少 getLifecycle 方法,因为定义如下:
override val lifecycle: Lifecycle
get() = dispatcher.lifecycle
Run Code Online (Sandbox Code Playgroud)
它应该实现 LifeCycleOwner 的接口方法 getLifecycle。
看来 AndroidStudio 正在使用 Gradle 之外的其他库。但是当我在 AndroidStudio 中导航时,似乎使用了 gradle 库。有什么解释吗,这是怎么回事,我该如何解决?
1)我有一个活动.此活动启动一项服务,该服务又创建并注册BroadcastReceiver.
2)我有一个活动.此活动创建并注册BroadcastReceiver.
BroadcastReceiver的生命何时终结于上述每一种情况?换句话说 - 当它被摧毁并且不再听广播时?
有什么意义:
super.onCreate(null);
Run Code Online (Sandbox Code Playgroud)
代替
super.onCreate(savedInstanceState);
Run Code Online (Sandbox Code Playgroud)
通过这种改变,我能够避免许多问题,否则Activity每次发生配置更改时都会困扰我(旋转,区域设置转换,权限切换).似乎通过此更改,Activity只要配置更改触发重新启动,就会重新启动.而且我似乎没有丢失任何数据或进程状态:我Activity的所有s都完全恢复到以前的状态.
我的问题是,我今后可以逍遥法外,或者在讨价还价中丢失一些东西吗?我真的不明白为什么这样做,无论是否安全,以及它对我的应用程序可能产生的意外影响.
我偶然发现这一招在这里.
相关问题:
android android-lifecycle android-configchanges android-activity android-savedstate
我偶尔会NullPointerException进入片段.它发生在应用程序在后台很长一段时间然后我打开它并滑动到这个片段.
public class SummaryFragment extends Fragment implements FragmentLifecycle {
private static final String TAG = "DTAG";
private DateFormat dateFormatName;
private Preference prefs;
private List<String> monthList;
private TextView totalTimeFullTv;
private TextView totalTimeNetTv;
private TextView averageTimeTv;
private TextView overUnderTv;
private TextView minTimeTv;
private TextView maxTimeTv;
private TextView vacationsTv;
private TextView sickTv;
private TextView headlineTv;
private TextView overUnderTvH;
private OnFragmentInteractionListener mListener;
public SummaryFragment() {
// Required empty public constructor
}
public static SummaryFragment newInstance(String param1, String param2) {
SummaryFragment fragment = …Run Code Online (Sandbox Code Playgroud) java android android-lifecycle android-fragments android-view
我遇到了一个相当奇怪的Activity生命周期问题。
短前传:
我发现的第一个症状是,IllegalArgumentException当我onStop在onStart.
转储活动接收器的完整列表(一些反射魔法)后,我发现我的接收器不是列表。它要么被错误地从其他地方删除,要么在onDestroy调用正在清理的Activity位置期间被删除Context(在onDestroy ActivityThread调用期间ContextImpl#performFinalCleanup,然后调用LoadedApk#removeContextRegistrations)。
怎么了?
在向崩溃添加更多分析信息后,我发现当崩溃发生时onStop,Activity它处于一种非常奇怪的状态 - 它是isDestroyed()调用返回true,它是isFinishing()返回false,它是getLifecycle().getCurrentState()返回DESTROYED......
检查正常onStop()(没有崩溃)调用表明Activity处于这种状态:
isDestroyed()是false,并且getLifecycle().getCurrentState()是CREATED在onStop。
所以我得出了onStop正在被调用的结论,onDestroy我认为这是不可能的,但它似乎发生了。
并且onStop绝对不会被应用程序中的其他东西手动调用,因为这是调用 的位置的堆栈跟踪onStop。
com.myapp.TheActivity.onStop (TheActivity.java:217)
android.app.Instrumentation.callActivityOnStop (Instrumentation.java:1474)
android.app.Activity.performStop (Activity.java:8189)
android.app.ActivityThread.callActivityOnStop (ActivityThread.java:4994)
android.app.ActivityThread.performStopActivityInner …Run Code Online (Sandbox Code Playgroud)