当手机从睡眠中唤醒时加载应用程序/活动
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 从睡眠中唤醒并开始活动?