标签: android-lifecycle

Android:使用支持片段管理器时复制片段

片段有一个非常奇怪的问题.我使用最新的支持库.我也使用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

12
推荐指数
1
解决办法
9840
查看次数

onCreate在向上导航中调用活动A.

所以我有一个活动A和一个活动B.我希望活动A能够通过按下按钮导航到活动B. 这是有效的,但是当我使用向上导航(操作栏中的主页按钮)导航回活动A时,再次调用onCreate()并且用户输入的旧信息将丢失.

我已经看到了:onCreate总是被调用,如果有意图导航,但他们使用Fragments,我希望不必重新设计整个应用程序来使用片段.每次活动A再次变为活动状态时,有什么方法可以阻止onCreate()被调用?

android android-lifecycle android-activity

12
推荐指数
3
解决办法
5363
查看次数

如何在onResume()中检索onSaveInstanceState()包?

我遇到了与保存我的活动状态相关的问题.我在这里搜索并阅读了很多问题但是我无法得到我的问题的答案.

我有一个ActivityA 2 Fragments.的ActivityA保持其由显示数据Fragments.当我推出一个新的Intent为我设置ActivityActivity一个暂停(不被破坏),onPause()onSaveInstanceState()方法被调用,所以我救我的所有数据onSaveInstaceState().

当我从我的设置返回时使用后退按钮ActivityA再次显示但是onCreate()没有调用方法因为Activity没有被销毁,而是onResume()方法被调用但是我在ActivityA中丢失了我的变量状态而我无法访问Bundle我保存的onSaveInstanceState()因为onCreate()不叫.

那么onSaveInstanceState()只有在旋转屏幕时才有用吗?如何访问我保存的所有数据onSaveInstanceState()?或者我应该将它们保存到文件中或以后SharedPrefs访问它们onResume()

android android-lifecycle android-activity

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

何时使用getSharedPreferences vs savedInstanceState?

我试图弄清楚何时使用已保存的实例状态与从共享首选项文件加载信息.我有两个我希望保存的变量,时间和分数.我想确保如果用户返回到游戏屏幕,他们的分数和时间被保存和恢复,无论它是来自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

12
推荐指数
1
解决办法
2883
查看次数

何时可以调用onTaskRemoved()?

文档说明了这一点

如果服务当前正在运行且用户已从服务的应用程序中删除了任务,则会调用此方法.

似乎只有当应用程序从最近的任务列表中滑出时才会调用它.按下后退按钮直到Activities任务中的所有内容都被销毁,这不会导致调用它.还有其他情况可以调用吗?

android android-service android-lifecycle

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

仅在 Android Studio 中出现编译错误,但在 Gradle 构建中则不然:抽象基类成员 getLifecycle() 未实现

在我的 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 库。有什么解释吗,这是怎么回事,我该如何解决?

android-lifecycle android-gradle-plugin

12
推荐指数
1
解决办法
1089
查看次数

BroadcastReceiver生命周期

1)我有一个活动.此活动启动一项服务,该服务又创建并注册BroadcastReceiver.

2)我有一个活动.此活动创建并注册BroadcastReceiver.

BroadcastReceiver的生命何时终结于上述每一种情况?换句话说 - 当它被摧毁并且不再听广播时?

service android broadcastreceiver android-lifecycle

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

Android Activity实例状态

有什么意义:

super.onCreate(null);
Run Code Online (Sandbox Code Playgroud)

代替

super.onCreate(savedInstanceState);
Run Code Online (Sandbox Code Playgroud)

通过这种改变,我能够避免许多问题,否则Activity每次发生配置更改时都会困扰我(旋转,区域设置转换,权限切换).似乎通过此更改,Activity只要配置更改触发重新启动,就会重新启动.而且我似乎没有丢失任何数据或进程状态:我Activity的所有s都完全恢复到以前的状态.

我的问题是,我今后可以逍遥法外,或者在讨价还价中丢失一些东西吗?我真的不明白为什么这样做,无论是否安全,以及它对我的应用程序可能产生的意外影响.

我偶然发现这一招在这里.

相关问题:

用null参数调用super.onCreate()?

在应用程序被杀之后,'Bundle savedInstanceState'是否会存活?

活动状态实例 - 见解?

活动的实例状态:自动存储和恢复的内容

android android-lifecycle android-configchanges android-activity android-savedstate

11
推荐指数
1
解决办法
1484
查看次数

访问片段视图时偶尔会出现NPE

我偶尔会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

11
推荐指数
1
解决办法
476
查看次数

onStop 在 onDestroy 之后被调用?

我遇到了一个相当奇怪的Activity生命周期问题。

短前传:

我发现的第一个症状是,IllegalArgumentException当我onStoponStart.

转储活动接收器的完整列表(一些反射魔法)后,我发现我的接收器不是列表。它要么被错误地从其他地方删除,要么在onDestroy调用正在清理的Activity位置期间被删除Context(在onDestroy ActivityThread调用期间ContextImpl#performFinalCleanup,然后调用LoadedApk#removeContextRegistrations)。

怎么了?

在向崩溃添加更多分析信息后,我发现当崩溃发生时onStopActivity它处于一种非常奇怪的状态 - 它是isDestroyed()调用返回true,它是isFinishing()返回false,它是getLifecycle().getCurrentState()返回DESTROYED......

检查正常onStop()(没有崩溃)调用表明Activity处于这种状态:

isDestroyed()false,并且getLifecycle().getCurrentState()CREATEDonStop

所以我得出了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)

android broadcastreceiver android-lifecycle

11
推荐指数
1
解决办法
344
查看次数