当手机从睡眠中唤醒时加载应用程序/活动

Posted

技术标签:

【中文标题】当手机从睡眠中唤醒时加载应用程序/活动【英文标题】:Load app/activity when phone wakes up from sleep 【发布时间】:2021-02-22 14:59:13 【问题描述】:

我有一个 android 活动,但是当手机进入睡眠状态(意味着我将手机放在那里几秒钟然后屏幕变黑)并且我重新打开它时,活动/应用程序消失了(它仍然处于活动状态但我必须按概览按钮才能返回活动/应用程序)。如何让它自动返回?

我想要做的是当手机进入睡眠状态时,当我重新打开它时,应用程序/活动就像它进入睡眠状态时一样。我检查了 onResume、BroadcastReceivers、WakeLock、KeepScreenOn、Services,但我知道我做得不对。

OnResume 不起作用,WakeLock 不起作用,KeepScreenOn,只是保持屏幕亮着,不允许手机休眠,我没有尝试过 Services 和 BroadcastReceivers,但我想我应该先在这里问一下。

请帮忙。谢谢。

我有 MainActivity.java,它最初打开,然后启动 AdminAddMerchantActivity.java。 AdminAddMerchantActivity.java 是一个导航视图,它启动 4 个片段,包括 TimeFragment.java,它有一个选项卡布局、一个视图分页器和一个分页器适配器。 TimeFragment.java 启动了包括 PriceFragment.java 在内的 5 个片段。 下面是活动生命周期方法。

MainActivity.java:

...
@Override
    protected void onPause() 
        super.onPause();
        Log.d("state", "Pausing Main");
        // Handle countdown stop here
    

    @Override
    protected void onResume() 
        super.onResume();

            Log.d("state", "Resuming Main");
        currentActivity = sharedPreferences.getString(CURRENT_ACT, "main");
        if(mAuth.getCurrentUser() != null)
        
            if(currentActivity.equals("confirmFinalOrder"))
            
                isResumed++;
                Intent intent = new Intent(MainActivity.this, ConfirmFinalOrderActivity.class);
                startActivity(intent);
                finish();
            
            else if(currentActivity.equals("merchantDetails"))
            
                isResumed++;
                Intent intent = new Intent(MainActivity.this, MerchantDetailsActivity.class);
                intent.putExtra("mid", sharedPreferences.getString("merchantid", ""));
                startActivity(intent);
                finish();
            
            else if(currentActivity.equals("navigation")) 
                isResumed++;
                Intent intent = new Intent(MainActivity.this, NavigationActivity.class);
                fragment = sharedPreferences.getString("fragment", "Find Food");
                intent.putExtra("activity", fragment);
                startActivity(intent);
                finish();
            
            else if(currentActivity.equals("adminaddnewmerchant"))
            
                isResumed++;
                Intent intent = new Intent(MainActivity.this, AdminAddNewMerchantActivity.class);
                startActivity(intent);
                finish();
            
            else if(currentActivity.equals("searchmerchants"))
            
                isResumed++;
                Intent intent = new Intent(MainActivity.this, SearchMerchantsActivity.class);
                startActivity(intent);
                finish();
            
            else if(currentActivity.equals("settingsuser"))
            
                isResumed++;
                Intent intent = new Intent(MainActivity.this, SettingsActivity.class);
                startActivity(intent);
                finish();
            
            else if(currentActivity.equals("settingsmerchant"))
            
                isResumed++;
                Intent intent = new Intent(this, SettingsMerchantActivity.class);
                startActivity(intent);
                finish();
            
            else if(currentActivity.equals("sellerregistration"))
            
                isResumed++;
                Intent intent = new Intent(MainActivity.this, SellerRegistrationActivity.class);
                startActivity(intent);
                finish();
            
        
        else
            if(currentActivity.equals("sellerregistration"))
            
                isResumed++;
                Intent intent = new Intent(MainActivity.this, SellerRegistrationActivity.class);
                startActivity(intent);
                finish();
            
            else if(!sharedPreferences.getString("current activity", "main").equals("login user")
                    && !sharedPreferences.getString("current activity", "main").equals("login merchant"))
            
                currentActivity = "main";

                SharedPreferences.Editor editor = sharedPreferences.edit();
                editor.clear();
                editor.putString(CURRENT_ACT,currentActivity);
                editor.commit();


                Paper.book().write(Prevalent.RememberMeMerchant, "false");
                Paper.book().write(Prevalent.emailKey, "UserEmail");
                Paper.book().write(Prevalent.passwordKey, "UserPassword");
            
        

        // Handle countdown start here
    

    @Override
    protected void onStop() 
        super.onStop();
        Log.d("state","Stopping Main");
    

    @Override
    protected void onDestroy() 
        super.onDestroy();
        Log.d("state", "Destroyed Main");
    

    @Override
    protected void onRestart() 
        super.onRestart();
        Log.d("state", "Restarted Main");

    

    @Override
    protected void onStart() 
        super.onStart();
        Log.d("state", "Started Main");

    

    @Override
    protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) 
        super.onRestoreInstanceState(savedInstanceState);
        Log.d("state", "onRestoreInstanceState Main");
    

    @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) 
        super.onSaveInstanceState(outState);
        Log.d("state", "onSaveInstanceState Main");
    
//if the user

    @Override
    public void onBackPressed() 
        Log.d("state", "back login");

        currentActivity = "main";

        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(CURRENT_ACT,currentActivity);
        editor.commit();
    
...

AdminAddNewMerchantActivity.java:

...
@Override
    public void onBackPressed()
    
        if(drawer.isDrawerOpen(GravityCompat.START))
        
            drawer.closeDrawer(GravityCompat.START);
        
        else
            super.onBackPressed();
        
    
@Override
    public void onResume() 
        super.onResume();  // Always call the superclass method first

        // Get the Camera instance as the activity achieves full user focus
        //if (mCamera == null) 
            //initializeCamera(); // Local method to handle camera init
        //
    
...

PriceFragment.java:

...
@Override
    public void onDestroy() 
        super.onDestroy();
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putInt("scrollPrice", scrollView.getScrollY());
        editor.commit();
    

    @Override
    public void onResume() 
        Log.d("onResume", "Resumed");
        super.onResume();

    
...

TimeFragment.java:

...
@Override
    public void onResume() 
        super.onResume();



    
...

【问题讨论】:

在问题中附上您的活动代码。 赛义夫,我得到了答案。谢谢。我需要进行一些调试来找出导致我的问题的原因 【参考方案1】:

默认的 Android 行为应该自动执行此操作...

你在 onPause 或 onStop 方法上做了什么特别的事情吗?

如果不是,您能否通过 Android Studio 创建一个新项目并测试该行为是否在新应用上仍然存在?

【讨论】:

我有活动 1、2 和 3。应用程序的第一个活动是活动 1。活动 1 产生 2 和 3。当我处于活动 2 或 3 并且手机进入睡眠状态时,应用程序就会消失。但是,当我在活动 2 或 3 中按下概览按钮并返回应用程序时,应用程序会恢复原样。我在 Acitivity 1s onResume 方法中做了一些事情,当我按下概览按钮时,它可以正常恢复并返回到活动 2 和 3。我还需要什么麻烦才能让它从睡眠中工作? Activity 1 自动调用 2 和 3?如果你没有对这些活动做任何“特别”的事情,Android 本身应该已经恢复了正确的活动。在这里,你可以看到Android lifecycle...当手机进入睡眠状态时,activity会通过onPause和onStop,当手机唤醒时,它会通过onStart和onResume.. 我为上面的每个活动/片段添加了我所有的生命周期方法。当应用程序进入睡眠状态并返回时,MainActivity.java 保持打开状态,但 AdminAddNewMerchantActivity.java 不会。当手机进入睡眠状态时,我检查了应用程序是否返回到我的 MainActivity.java 的 onResume 方法,但它没有 您在打开 AdminAddNewMerchantActivity 时调用 MainActivity 上的完成,因此当手机进入睡眠状态并唤醒时,它应该直接转到 AdminAddNewMerchantActivity 的 onResume。也许它正在失去对其片段的引用?当手机唤醒时,您是看到手机主屏幕还是看到空白屏幕?你能把日志放在碎片上的 onViewCreated 和 onDestroyView 上,看看它在手机进入睡眠状态时被销毁了吗? 从我的 mainActivity 中删除 finish() 有效!谢啦!我感谢您的帮助!这一直困扰着我,直到您提供帮助:D

以上是关于当手机从睡眠中唤醒时加载应用程序/活动的主要内容,如果未能解决你的问题,请参考以下文章

是否需要为具有活动 LocationListener 的 Android 服务获取唤醒锁?

如何从睡眠中唤醒安卓手机?

如何通过 c2dm 通知将 Android 从睡眠中唤醒并开始活动?

使用信号从睡眠中唤醒进程

当计算从睡眠模式或待机模式唤醒时,基于图像的 jframe 变为白色

如何在睡眠模式下唤醒 Android Wear?