使用onResume()
我可以检查活动是否是前景。我的问题是,即使我来自此活动的另一项活动,onResume()
每次都会点火。
所以我的主要问题是,如果我通过主页按钮最小化应用程序,我想在应用程序到达前景时在每个活动中执行一些代码,但不使用onResume()
。
我找到了这样的答案How to know in BroadcastReceiver if App is running on foreground?但我不知道如何在Android menifest中注册这个接收器以在应用程序可见时获取触发器。
请给我一些提示,如何克服这个可以帮助我的解决方案或代码段。在此先感谢:)
答案 0 :(得分:2)
要做的事情就是计算应用程序中调用onStart / onStop的次数。这将帮助您确定是否从应用程序内部或外部转换到您的活动。
您必须扩展Application,然后在该课程中创建/注册ActivityLifecycleCallbacks。此外,请确保指定您在AndroidManifest中创建的新Application类。
现在,诀窍是在onActivityStarted / onActivityStopped中保留一个计数变量,以确定您的Activity是从应用程序内部还是外部导航到的。
假设您的应用中有2个活动:FirstActivity& SecondActivity。
如果从FirstActivity导航到SecondActivity,生命周期调用将按以下顺序进行:FirstActivity.onStart()> SecondActivity.onStart(),计数为1。
如果从应用程序外部导航,则只会看到FirstActivity.onStart(),因此计数为0.这就是假设您在调用super.onStart()后检查计数。
因此,通过检查0/1的计数,您可以判断您的活动是从应用程序内部还是在应用程序外部启动。
/**
* Extending the application class lets you use ActivityLifecycleCallbacks to
* keep track of all lifecycle callbacks in your application.
*/
public class MyApplication extends Application implements ActivityLifecycleCallbacks {
private int count = 0;
//Register activity lifecycle callbacks in onCreate
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(this);
}
void onActivityStarted(Activity activity) {
count++;
}
void onActivityStopped(Activity activity) {
count--;
}
/**
* Use this method in your Activities to test if the activity was
* transitioned to from outside the application.
*
* If you call this method in Activity.onResume(), then count should be
* compared to 0. If you call this method in Activity.onStart() but
* *before* calling super.onStart(), then count should be compared to 0.
*
* However, if you call this method after super.onStart(), then count
* should be compared to 1.
*/
public boolean cameFromOutsideApplication() {
return count == 0;
}
//Don't need to use the rest of the activity lifecycle callbacks
void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
void onActivityDestroyed(Activity activity) {
}
void onActivityPaused(Activity activity) {
}
void onActivityResumed(Activity activity) {
}
void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
}
您可能会获得更多信息here,但它不使用更容易使用的ActivityLifecycleCallbacks。
答案 1 :(得分:-1)
如果您想注册接收器,可以使用以下代码,
<receiver
android:name="com.package.name.ReceiverClassName"
android:enabled="true" >
</receiver>