注册Android活动生命周期没有被触发

4

我正在开发一个Android应用程序,尝试注册活动生命周期回调。

在我的启动器活动(Agreement.java)的onCreate方法中,我有以下内容:

this.getApplication().registerActivityLifecycleCallbacks(new LoginManager());

这个活动会检查是否已经同意了协议,如果是,则立即完成并调用LoginActivity.java,但是我在我的活动回调类中的toast通知和logcat消息都没有显示,因此看起来它似乎没有被触发。

下面是实现活动回调的LoginManager类:

public class LoginManager extends Application implements Application.ActivityLifecycleCallbacks
{
    private final String TAG = "LoginManager";
    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState)
    {
        Toast.makeText(activity, "Activity Created", Toast.LENGTH_LONG).show();
        Log.d(TAG, "Activity Created");
        long currentEpochTime = System.currentTimeMillis() / 1000l;
        Log.d(TAG, "Current Epoch: " + currentEpochTime);
        CommonTasks commonTasks = new CommonTasks(activity);
        SharedPreferences settings = commonTasks.getAppsSharedPreferences();

        long timeDifference = currentEpochTime - settings.getLong(Defines.SharedPreferenceSettings.LAST_ACTIVE_EPOCH, 0);
        Log.d(TAG, "Time Difference: " + timeDifference);
        if (timeDifference >= 120) //2 Minutes
        {
            Log.d(TAG, "Logging out");
            //Over 2 minutes so we need to logout
            Intent intent = new Intent(activity, LoginActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
            activity.startActivity(intent);
        }
        else
        {
            Log.d(TAG, "Not Logging Out");
            //No need to logout, save the current time
            SharedPreferences.Editor editor = settings.edit();
            editor.putLong(Defines.SharedPreferenceSettings.LAST_ACTIVE_EPOCH, currentEpochTime);
            editor.commit();
        }
    }

为了再次强调,Agreement类注册了生命周期回调(LoginManager),立即关闭并显示LoginActivity,但toast和logcat未触发。


那么除了 toast 和 log 之外,注释掉所有内容就没有输出了吗? - Petro
那么,当用户在2分钟后开始新的活动时,您是强制将其带回登录屏幕吗?这并不能阻止某人在一个活动中停留超过2分钟... - OneCricketeer
@cricket_007 我不需要担心那个。 - Boardy
3个回答

5
在你的LoginManager类中添加。
 @Override
    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(this);
    }

删除

this.getApplication().registerActivityLifecycleCallbacks(new LoginManager());

来自Agreement.java


1

您注册回调函数太晚了。活动已经创建,因此不会调用回调函数。您是否尝试在Application的onCreate期间进行注册,而不是在Activity中进行注册?您可以定义自己的Application类,并通过将应用程序名称属性指定为您的自定义类来在清单中指示。


“你可以定义自己的Application类”--是的,显然已经按照LoginManager extends Application完成了。 - OneCricketeer
但是你正在实例化LoginManager。Android不会创建您的应用程序对象。正常流程是在启动应用程序时由操作系统实例化Application对象或其自定义子类。 - greenrobo
抱歉,我的意思是编写代码的人手动实例化了LoginManager对象,这是不正确的。 - greenrobo

0

你在清单文件中设置了应用程序类的类名吗?像这样:

<application
android:name=".LoginManager"
android:theme="@style/AppTheme">

另外,为什么不把它放在

registerActivityLifecycleCallbacks(this);

在你的LoginManager的onCreate方法内部?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接