标签: android-lifecycle

旋转时调用DatePickerDialog onDateSet

我正在使用DialogFragment在onCreateDialog()中返回DatePickerDialog.我已将dateSetListener设置为DialogFragment(下面的示例中为"this"),除了在屏幕旋转发生时调用onDateSet()时,一切正常,这是不可取的.如何在旋转屏幕时让onDateSet不被调用?

我的DialogFragment

public static class DateDialogFragment extends DialogFragment implements
DatePickerDialog.OnDateSetListener{

    public static DateDialogFragment newInstance() {
        return new DateDialogFragment();
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new DatePickerDialog(getActivity(), this, 2012, 11, 19);
    }

    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear,
        int dayOfMonth) {
        //This is called when screen rotated, which I dont want
        Toast.makeText(getActivity(), "Year: "+year+" Month: "+monthOfYear+" Day: "+dayOfMonth, Toast.LENGTH_SHORT).show();
    }

}
Run Code Online (Sandbox Code Playgroud)

这就是我所说的

if(getActivity()!=null){
    FragmentManager fm = getActivity().getSupportFragmentManager();
    DialogFragment newFragment = DateDialogFragment.newInstance();
    newFragment.show(fm, "dialog");
}
Run Code Online (Sandbox Code Playgroud)

android android-lifecycle android-fragments

8
推荐指数
2
解决办法
1564
查看次数

Android - 如果第一次加载Activity,则阻止onResume()函数(不使用SharedPreferences)

在我当前的应用程序中,第一次加载Activity时会触发onResume函数.我查看了Activity Lifecycle,但我没有找到防止这种情况发生的方法.

我是否可以在第一次加载Activity时阻止加载onResume()函数,而不使用SharedPreferences?

android onresume sharedpreferences android-lifecycle android-activity

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

在Fragment的onActivityCreated()之前调用onStart()的活动

我遇到的问题onActivityCreated()是在调用activity的onStart()方法后调用我的片段方法.这似乎意味着我的活动的onCreate()方法正在完成之后onStart()?情况不是这样......可以吗?在我的活动的生命周期中,我的片段onActivityCreated()被称为?此外,如果我有多个片段,我如何控制片段onActivityCreated()调用的顺序?

在我的活动中:

@Override
protected void onStart() {
    super.onStart();
    methodA(); // this is called ...
}
Run Code Online (Sandbox Code Playgroud)

在我的片段中:

    @Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    methodB(); // ... before this
}
Run Code Online (Sandbox Code Playgroud)

java android android-lifecycle android-fragments android-activity

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

Activity和Fragment中的自动UI配置更改处理有时会失败

我已经写了很长时间的Android应用程序,但现在我遇到了一个我从未想过的问题.这是关于Android的生命周期Activitys,并Fragments在有关的配置更改.为此,我用这个必要的代码创建了一个小应用程序:

public class MainActivity extends FragmentActivity {

    private final String TAG = "TestFragment";
    private TestFragment fragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FragmentManager fm = getSupportFragmentManager();
        fragment = (TestFragment) fm.findFragmentByTag(TAG);

        if (fragment == null) {
            fragment = new TestFragment();
            fm.beginTransaction().add(R.id.fragment_container, fragment, TAG).commit();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的代码TestFragment.需要注意的是我打电话setRetainInstance(true);onCreate方法,这样的片段没有在配置更改后recrated.

public class TestFragment extends Fragment implements View.OnClickListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    @Override
    public View onCreateView(LayoutInflater li, …
Run Code Online (Sandbox Code Playgroud)

android android-lifecycle android-fragments android-activity

8
推荐指数
1
解决办法
783
查看次数

Android:finishAffinity()vs finishAndRemoveTask()

TLDR:finishAffinity()和finishAndRemoveTask()之间有什么区别?

我正在开发一个只有一个活动的Android应用程序,并使用片段切换而不是新活动.

即使在清理后台堆叠时,我也会遇到一个奇怪的问题,即通过背板生活的某个碎片.长话短说,这个片段是活的,因为我从那个片段开始了一个网络浏览器.

使用流行的按回x2在我的主要活动中退出app技术,它将使用finishAndRemove任务"退出".这将返回到某个片段,而不是完全退出.将后面的x2退出流程从finishAndRemoveTask更改为finishAffinity解决了我的问题.为什么这样做?

android android-lifecycle android-fragments

8
推荐指数
1
解决办法
8281
查看次数

如何解决Could not find android.arch.lifecycle:compiler?

我正在尝试使用 Android 生命周期,但我正在准备添加生命周期编译器依赖项。

这是模块 build.gradle,

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
android {
    compileSdkVersion 25
    buildToolsVersion "26.0.0"
    dataBinding {
        enabled = true
    }
    defaultConfig {
        applicationId "com.example.jj.mvvm"
        minSdkVersion 19
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    kapt 'com.android.databinding:compiler:2.3.3'

    implementation "android.arch.lifecycle:runtime:1.0.0" …
Run Code Online (Sandbox Code Playgroud)

android-lifecycle

8
推荐指数
1
解决办法
8794
查看次数

Viewmodel观察LiveData - 怎么样?

在之前Lifecycle和之前LiveData,Viewmodel可以很容易地观察到它自己的观察者的变化.这只是订阅Observable*变化并对其做出反应的问题.然后可以使用双向绑定立即对用户的输入做出反应.

在Android Studio Canary中,现在允许绑定到LiveData对象,前提是Binding知道其所有者的生命周期(ViewBinding现在有其他setLifecycle方法),Android Studio Canary信息:

您现在可以将LiveData对象用作数据绑定表达式中的可观察字段.ViewDataBinding类现在包含一个新的setLifecycle方法,您需要使用该方法来观察LiveData对象.

但是,Viewmodel文档清楚地说明了:

ViewModel对象可以包含LifecycleObservers,例如LiveData对象.但是,ViewModel对象绝不能观察到生命周期感知的可观察对象(例如LiveData对象)的更改.

(强调我的)

那么,如果ViewModel无法订阅它们,那么如何立即对LiveData更改做出反应呢?

而且,为什么 Viewmodel无法观察到自己的LiveData的变化?

binding android mvvm android-lifecycle android-livedata

8
推荐指数
2
解决办法
3170
查看次数

如何使用 ProcessLifecycleOwner 捕获生命周期事件?

我想(至少部分地)决定当应用程序被用户释放一些连接等。要做到这一点关门,我现在用的是ProcessLifecycleOwner我的应用程序类实现LifecycleObserver。尽管从教程和其他有用的文章中获取了起始代码,但它似乎没有检测到任何生命周期事件。

大部分代码来自这个例子

我的应用类:

public class App extends Application implements LifecycleObserver {
    @Override
    public void onCreate() {
        super.onCreate();

        ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void created() {
        Log.d("SampleLifeCycle", "ON_CREATE");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void started() {
        Log.d("SampleLifeCycle", "ON_START");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void resumed() {
        Log.d("SampleLifeCycle", "ON_RESUME");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void paused() {
        Log.d("SampleLifeCycle", "ON_PAUSE");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void stopped() {
        Log.d("SampleLifeCycle", "ON_STOP");
    }
}
Run Code Online (Sandbox Code Playgroud)

Gradle 中的依赖

dependencies {
    //...
    implementation 'android.arch.lifecycle:extensions:1.1.1'
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,无论应用程序是进入前台还是后台,此代码都没有记录任何类型的单个事件。

编辑

注意:您需要在 Manifest 中声明您的应用程序,以便在您的自定义应用程序类中工作。

java android android-lifecycle android-architecture-components

8
推荐指数
1
解决办法
4640
查看次数

如何从 AbstractSavedStateViewModelFactory 动态设置包

我的视图模型工厂

class ViewModelFactory @Inject constructor(
    private val viewModelMap: MutableMap<Class<out ViewModel>, ViewModelAssistedFactory<out ViewModel>>,
    owner: SavedStateRegistryOwner,
    defaultArgs: Bundle?
) : AbstractSavedStateViewModelFactory(owner, defaultArgs) {

    @Throws(IllegalStateException::class)
    @Suppress("UNCHECKED_CAST")
    override fun <T : ViewModel?> create(key: String, modelClass: Class<T>, handle: SavedStateHandle): T {
        return viewModelMap[modelClass]?.create(handle) as? T ?: throw IllegalStateException("Unknown ViewModel class")
    }
}
Run Code Online (Sandbox Code Playgroud)

活动

@Inject
lateinit var viewModelFactory: ViewModelFactory
protected val viewModel: ViewModel by lazy { ViewModelProvider(this, viewModelFactory).get(getViewModelClass()) }
Run Code Online (Sandbox Code Playgroud)

视图模型

@AssistedInject.Factory
interface Factory : ViewModelAssistedFactory<SplashViewModel>
Run Code Online (Sandbox Code Playgroud)

我想知道如何动态提供 defaultArgs 而不是:

活动模块

@Module
    companion object …
Run Code Online (Sandbox Code Playgroud)

android android-lifecycle dagger-2 android-viewmodel viewmodel-savedstate

7
推荐指数
1
解决办法
2196
查看次数

AssertionError:活动永远不会变成请求的状态“[DESTROYED、STARTED、RESUMED、CREATED]”(最后一个生命周期转换=“PRE_ON_CREATE”)

我最近更新了我的Android 应用程序项目(Android Gradle Plugin 7.0.3、targetSdk 30、JVM 11)的Travis CI 配置以使用新的命令行工具。我选择启动模拟器来运行仪器测试。我在用。system-images;android-19;google_apis;armeabi-v7aandroidx.test.espresso:espresso-core:3.4.0

模拟器启动并执行仪器测试,connectedDebugAndroidTest但全部失败并出现以下错误:

AboutActivityTest > renderBuildInformation[test(AVD) - 4.4.2] FAILED 
  java.lang.AssertionError: Activity never becomes requested state 
  "[DESTROYED, STARTED, RESUMED, CREATED]" (last lifecycle transition = "PRE_ON_CREATE")
  at androidx.test.core.app.ActivityScenario.waitForActivityToBecomeAnyOf(ActivityScenario.java:338)
...
Run Code Online (Sandbox Code Playgroud)

Gradle 然后输出:

Caused by: org.gradle.api.GradleException: There were failing tests. See the report 
  at: file:///home/travis/build/Umweltzone/Umweltzone/Umweltzone/build/reports/androidTests/connected/index.html
  at com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask.doTaskAction(DeviceProviderInstrumentTestTask.java:388)
  at com.android.build.gradle.internal.tasks.NonIncrementalTask$taskAction$$inlined$recordTaskAction$1.invoke(BaseTask.kt:63)
  at com.android.build.gradle.internal.tasks.Blocks.recordSpan(Blocks.java:51)
  ...
Run Code Online (Sandbox Code Playgroud)

完整构建日志:

如果我在 Pixel 2 设备、Android 11 (SDK 30) 上本地运行相同的测试,则会成功执行。
如何修复 Travis CI / Android 模拟器配置? …

android android-emulator android-lifecycle travis-ci android-espresso

7
推荐指数
0
解决办法
1374
查看次数