0

我真的希望,有人可以指出我正确的方向。我目前正在开发一个用于医疗目的的应用程序。为了保护他们的个人数据,用户将获得创建密码的能力。如果没有该密码,至少应该无法访问整个应用程序。我在我的活动的直接子类中实现了一个简单的输入对话框(它被所有其他活动继承)。

但是如果应用程序启动另一个活动,生命周期也会触发密码对话框。即使用户只是保存了他的数据。

我如何识别用户来自应用程序外部?我尝试了很多,如果它只是启动另一个活动或被发送到后台并且用户回来(这应该触发对话框),似乎生命周期保持不变。

提前致谢

4

2 回答 2

0

好的...我终于找到了解决这个问题的方法。最后,继承应用程序是正确的选择。我正在保存最后一个暂停的活动,如果同一活动随时恢复,我会显示对话框。我还必须处理配置更改,这会导致活动重新启动。如果有人遇到和我一样的问题,代码如下:

package at.***.**********.util;

import org.holoeverywhere.app.Application;

import android.app.Activity;
import android.content.ComponentCallbacks;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;

public class MyCustomApplication extends Application {
    private String lastActivity = "";
    private Boolean configChanged = false;

    public Boolean getConfigChanged() { return configChanged; }
    public void setConfigChanged(Boolean configChanged) { this.configChanged = configChanged; }

    private ActivityLifecycleCallbacks activityCallback = new ActivityLifecycleCallbacks() {
        @Override
        public void onActivityStopped(Activity activity) { }
        @Override
        public void onActivityStarted(Activity activity) { }
        @Override
        public void onActivitySaveInstanceState(Activity activity, Bundle outState) { }
        @Override
        public void onActivityDestroyed(Activity activity) { }
        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) { }

        @Override
        public void onActivityResumed(Activity activity) {
            if (activity.getClass().getName().equals(lastActivity) && !getConfigChanged()) {
                Log.v(activity.getClass().getName(), "Make activity show password dialog");
            }
            setConfigChanged(false);
        }

        @Override
        public void onActivityPaused(Activity activity) {
            lastActivity = activity.getClass().getName();
        }
    };

    private ComponentCallbacks componentCallback = new ComponentCallbacks() {
        @Override
        public void onLowMemory() { }
        @Override
        public void onConfigurationChanged(Configuration newConfig) {
            setConfigChanged(true);
        }
    };

    @Override
    public void onCreate() {
        registerActivityLifecycleCallbacks(activityCallback);
        registerComponentCallbacks(componentCallback);
        Log.v("Application startet", "Application startet");
        super.onCreate();
    }

    @Override
    public void onTerminate() {
        unregisterActivityLifecycleCallbacks(activityCallback);
        unregisterComponentCallbacks(componentCallback);
        super.onTerminate();
    }
}

如果您不得不重新开始您的活动,您可以致电:

((MyCustomApplication)getApplication).setconfigChanged(true);

不要忘记,告诉 Android 在清单中使用您的自定义应用程序:

<application
    android:name="at.***.**********.util.MyCustomApplication"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:hardwareAccelerated="true" >

我确信可能有更好的方法,但我还没有找到。非常感谢你们!

于 2013-07-05T08:51:00.397 回答
0

您可以使用SharedPreferences编写一个标志,表明您已登录。然后您可以在主要活动的 onDestroy 或您从应用程序注销的任何位置清除该标志。

于 2013-07-04T15:26:54.193 回答