标签: android-lifecycle

Android 内存不足时前台服务(不同进程/同一进程)的行为方式

如果Service在不同的进程中运行(通过:name清单内的 \xe2\x80\x9c \xe2\x80\x9d)并带有前台标志。当系统想要释放一些内存时..(想象一下繁重的用户界面,用户按主页并导航到其他繁重的应用程序)

\n\n
    \n
  1. 它会仅杀死该应用程序的主进程以释放资源吗?(显然保持服务进程完好无损),然后just当用户导航回应用程序时重新启动主进程。

  2. \n
  3. 如果Service运行在同一个进程中,它会释放除前台服务之外的所有资源(例如活动)吗?或者在这种情况下整个进程(带有大量用户界面)将被视为前台,因此消耗大量内存并且对用户手机不利

  4. \n
\n\n

聚苯乙烯

\n\n

据我所知,对前台服务没有任何保证。\n http://developer.android.com/reference/android/app/Service.html

\n\n

我了解立即杀死进程的android设计\n(这回答了第二个问题,但想确定)

\n\n

http://android-developers.blogspot.com/2010/04/multitasking-android-way.html

\n

android android-service android-lifecycle android-memory

5
推荐指数
1
解决办法
1026
查看次数

onRestoreInstanceState 没有被调用

我想在应用程序进入 onPause 时保存 textView 的值。所以我实现了onSaveInstanceState和onRestoreInstanceState。但如下面的 logcat 输出所示,onRestoreInstanceState 从未被调用。

我知道 onRestoreInstanceState 和 onSaveInstanceState 都不属于应用程序生命周期的一部分,那么为什么 onSaveInstanceState 会被调用,而 onRestoreInstanceState 不会被调用呢?以及如何调用onRestoreInstanceState?

代码

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    Log.w(TAG, LogAnd.i("onResume", ""));

    btAdapter = BluetoothAdapter.getDefaultAdapter();
    if (btAdapter == null) {
        tvStatus.setText("[" + SysUtils.getDeviceName() + "] no Bluetooth installed.");
    } else {
        tvStatus.setText("[" + SysUtils.getDeviceName() + "] Bluetooth installed.");
    }
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    // TODO Auto-generated method stub
    super.onSaveInstanceState(outState);
    Log.w(TAG, LogAnd.i("onSaveInstanceState", ""));

    outState.putString("statusText", tvStatus.getText().toString());
}

@Override …
Run Code Online (Sandbox Code Playgroud)

android bundle android-lifecycle

5
推荐指数
1
解决办法
4112
查看次数

安卓。屏幕旋转问题后,片段保持活动状态

我有两个变体的activity_main.xml(用于纵向/横向)。在此活动中,用户可以选择项目并浏览所选项目的详细信息。

在纵向方向上,片段动态添加到flFragmentContainer中,选择项目后,详细信息片段替换列表片段:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <FrameLayout
        android:id="@+id/flFragmentContainer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></FrameLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

在横向方向上,XML 文件中静态描述的片段:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
        <fragment
            android:id="@+id/frgTaskList"
            android:name="com.exprod.xchecklist.fragments.TaskListFragment"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            tools:layout="@layout/fragment_task_list" />
        <fragment
            android:id="@+id/frgTaskDetails"
            android:name="com.exprod.xchecklist.fragments.TaskDetailsFragment"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            tools:layout="@layout/fragment_task_details">
        </fragment>
    </LinearLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

这是(MainActivity 的)onCreate() 方法的代码。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FragmentManager fragmentManager = getSupportFragmentManager();
        TaskDetailsFragment taskDetailsFragment = (TaskDetailsFragment)fragmentManager.findFragmentById(R.id.frgTaskDetails);
        isDynamicMode = taskDetailsFragment == null || !taskDetailsFragment.isInLayout();
        if(isDynamicMode){
            FragmentTransaction transaction = fragmentManager.beginTransaction();
            Fragment …
Run Code Online (Sandbox Code Playgroud)

android android-layout android-lifecycle android-fragments

5
推荐指数
1
解决办法
3275
查看次数

与 Kotlin 代表一起享受更多乐趣

如果您了解 Google 的实验性 Android 架构组件,您可能就知道MutableLiveData。为了让它使用起来更有趣,我带来了:

\n\n
class KotlinLiveData<T>(val default: T) {\n    val data = MutableLiveData<T>()\n\n    operator fun getValue(thisRef: Any?, property: KProperty<*>):T {\n        return data.value ?: default\n    }\n\n    operator fun setValue(thisRef: Any?, property: KProperty<*>, value:T) {\n        if (Looper.myLooper() == Looper.getMainLooper()) {\n            data.value = value\n        } else {\n            data.postValue(value)\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我可以:

\n\n
var name : String by KotlinLiveData("not given")\nname = "Chrz\xc4\x99szczybrz\xc4\x99czykiewicz"\n
Run Code Online (Sandbox Code Playgroud)\n\n

但可惜 - 这使得data需要注册的内容Observer无法访问:

\n\n
name.data.observe(this, nameObserver) // won\'t work :(\n
Run Code Online (Sandbox Code Playgroud)\n\n

知道我是否能以某种方式得到它吗? …

delegates android-lifecycle kotlin android-databinding

5
推荐指数
1
解决办法
2161
查看次数

super.onCreate(savedInstanceState) 在第一次运行时崩溃

Firebase 崩溃报告捕获的异常:

异常 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.talmir.mickinet/com.talmir.mickinet.activities.HomeActivity}:android.content.res.Resources$NotFoundException:资源 ID 0x7f080058 android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2249) android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2299) android.app.ActivityThread.access$700 (ActivityThread.java:154) android.app.ActivityThread$H.handleMessage ...

由 android.content.res.Resources$NotFoundException 引起:资源 ID 0x7f080058 android.content.res.Resources.getValue (Resources.java:1883) android.support.v7.widget.AppCompatDrawableManager.c (SourceFile:332) android.support .v7.widget.AppCompatDrawableManager.a (SourceFile:197) android.support.v7.widget.AppCompatDrawableManager.getDrawable ...

HomeActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home); // line 238
FirebaseCrash.log("HomeActivity");

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
    if (!canAccessCamera() || !canAccessExternalStorage() || !canAccessContacts())
        requestPermissions(INITIAL_PERMISSIONS, INITIAL_REQUEST);

copyRawFile(R.raw.file_receive);
// other codes...
Run Code Online (Sandbox Code Playgroud)

活动主页.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_home"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingBottom="@dimen/activity_vertical_margin"
        tools:context="com.talmir.mickinet.activities.HomeActivity"
        android:background="@color/snow">

    <fragment
            android:id="@+id/frag_list"
            class="com.talmir.mickinet.fragments.DeviceListFragment"
            android:layout_width="match_parent"
            android:layout_height="@dimen/phone_list_height">
    </fragment>

    <fragment
            android:id="@+id/frag_detail" …
Run Code Online (Sandbox Code Playgroud)

java android android-lifecycle android-4.2-jelly-bean android-6.0-marshmallow

5
推荐指数
1
解决办法
2165
查看次数

当Fragment不可见时如何防止LiveData观察者被激活

我想用LiveDatainFragment来观察一些数据的变化。现在我们假设:

  1. Fragment A都有Fragment B自己的容器布局Activity,这意味着我们将FragmentTransaction#add()单独调用它们,并且由于没有任何操作,它们的onPause()onResume()在添加(UI 更改)期间不会被调用FragmentTransaction#replace()
  2. B的容器比A的容器大,这意味着如果添加B,用户将看不到A。
  3. A中有一个LiveData名为O的观察者,它会观察一些数据的变化,并据此更新UI。关键是:我们想要为变化播放一些动画,而不是TextView#setText()天真地调用属性设置器(如)。例如,动画可能是我们调用后播放的动画RecyclerView.Adapter#notifyItemInserted()

添加B后,A就被视为对用户不可见。Fragment A然而,其生命周期或View通过调用getViewLifecycleOwner()仍然处于开启STARTED状态RESUMED。结果,O观察到数据变化后就会播放动画,但用户从一开始就看不到它。

我们该如何解决这个问题呢?任何想法或答案表示赞赏。提前致谢。

android android-lifecycle android-fragments fragment-lifecycle android-livedata

5
推荐指数
1
解决办法
2081
查看次数

FirebaseMessagingService 可以成为生命周期所有者吗?

服务可以扩展LifecycleService哪个implements LifecycleOwner。如何让 FirebaseMessagingService 成为其中之一。即使它只是实现 LifecycleOwner,它会在重写的方法上返回什么getLifecycle()我需要它的背景是,通知启动了WorkManager通过观察谁的工作LiveData

android android-lifecycle firebase-cloud-messaging android-architecture-components android-workmanager

5
推荐指数
0
解决办法
700
查看次数

错误:无法解析:androidx.lifecycle:lifecycle:2.2.0-beta01

我的文件有问题build.gradle,特别是 module 'android.x.lifecycle'

我有以下错误

ERROR: Failed to resolve: androidx.lifecycle:lifecycle:2.2.0-beta01
This is the last version of androidx.lifecycle
Run Code Online (Sandbox Code Playgroud)

不知道是不是语法错误

这是build.gradle文件

    apply plugin: 'com.android.application'

android {
    compileSdkVersion 29
    defaultConfig {
        applicationId "com.flixarts.ar.englishnow"
        minSdkVersion 14
        targetSdkVersion 29
        buildToolsVersion '25.0.2'
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    buildToolsVersion = '28.0.3'
}

dependencies {
    implementation 'androidx.lifecycle:lifecycle:2.2.0-beta01'
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.recyclerview:recyclerview:1.0.0'
    implementation 'com.google.android.material:material:1.1.0-beta01'
    implementation fileTree(dir: 'libs', …
Run Code Online (Sandbox Code Playgroud)

android android-lifecycle build.gradle androidx

5
推荐指数
1
解决办法
5152
查看次数

当“不保持活动”开发选项打开时,ViewModel 会被清除

这是我的设置 1. Main Activity - Contains MainFragment Mainfragment - Has MainFragViewModel

重现 - 1. 在开发者设置中打开不保留活动。2. 启动应用程序。3. 按主页。

现在,由于我们的设置,当应用程序进入后台时会发生以下活动。1. 片段视图模型 - onCleared() [意外,因为系统正在杀死片段,并且应用程序进程没有被杀死。] 2. 片段被破坏 [预期] 3. 主活动被破坏 - isFinishing = false(这意味着框架知道谁正在杀死)[预期] 4.应用程序没有被破坏[预期]

现在从后台应用程序卡再次启动应用程序。接下来发生了。1. 主要活动 - onCreate(bundle != null) [预期。还送了捆绑包!一切顺利] 2. 片段已创建 [预期 - 捆绑包已交付。即不为空] 3. FragmentViewModel 实例已创建 [意外!!因为视图模型应该存活下来。因为我们没有弹出片段。由于dev设置被系统杀掉了]

这种行为破坏了我的设计,并且为了使我的应用程序在开发人员手机上正常工作,他们可能会不保持活动。我必须将信息保存在捆绑包中!

我缺少什么?您可能的解决方案是什么?

android mvvm viewmodel android-lifecycle

5
推荐指数
1
解决办法
1668
查看次数

即使应用程序关闭或终止,flutter 中的异步操作是否仍在运行

我想做一些异步操作,仅当应用程序的状态为 InActive 或 Paused 时才涉及写入本地数据库,但是如果异步操作在运行时突然关闭应用程序怎么办

该操作在完成任务之前是否仍然有效?

future android-lifecycle async-await ios-lifecycle flutter

5
推荐指数
1
解决办法
1123
查看次数