版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zsp_android_com/article/details/86079708
活动
代码
Application
package application;
...
/**
* Created on 2017/8/22.
*
* @author xxx
* @desc 官方文档
* Base class for those who need to maintain global application state.
* You can provide your own implementation by specifying its name in your AndroidManifest.xml's <application> tag,
* which will cause that class to be instantiated for you when the process for your application/package is created.
* Application类(基础类)用于维护应用程序全局状态。
* 你可提供自己的实现,在AndroidManifest.xml文件<application>标签指定它的名字,
* 这将引起你的应用进程被创建时Application类为你被实例化。
* <p>
* Android系统在每应用程序运行时创且仅创一Application实例,故Application可当单例(Singleton)模式一类;
* 对象生命周期整应用程序最长,等同应用程序生命周期;
* 全局唯一,不同Activity、Service中获实例相同;
* 数据传递、数据共享、数据缓存等。
*/
public class App {
/**
* 实例
*/
private static App instance = null;
/**
* 当前活动
*/
private Activity currentActivity;
public static App getInstance() {
return instance;
}
/**
* 应用程序创调
* 创和实例化任何应用程序状态变量或共享资源变量,方法内获Application单例。
*/
@Override
public void onCreate() {
LogManager.e("Application", "onCreate");
super.onCreate();
// Application本已单例(可如下处理)
instance = this;
}
/**
* 应用程序对象终止调
* 不定调。当应用程序被内核终止为别应用程序释放资源,将不提醒且不调用应用程序对象onTerminate()而直接终止进程。
*/
@Override
public void onTerminate() {
LogManager.e("Application", "onTerminate");
super.onTerminate();
}
/**
* 系统资源匮乏调
* 通在后台进程已结束且前台应用程序仍缺内存时调,重写该方法清空缓存或释放非必要资源。
*/
@Override
public void onLowMemory() {
LogManager.e("Application", "onLowMemory");
super.onLowMemory();
}
/**
* 运行时决定当前应用程序应减内存开销时(通常进入后台运行)调,含一level参数,用于提供请求的上下文。
*
* @param level 级别
*/
@Override
public void onTrimMemory(int level) {
LogManager.e("Application", "onTrimMemory");
super.onTrimMemory(level);
}
/**
* 与Activity不同,配置改变时应用程序对象不终止和重启。若应用程序用值依赖特定配置,则重写该方法加载这些值或于应用程序级处理配置值改变。
*
* @param newConfig 配置
*/
@Override
public void onConfigurationChanged(Configuration newConfig) {
LogManager.e("Application", "onConfigurationChanged");
super.onConfigurationChanged(newConfig);
}
/**
* Activity全局监听
*/
private void registerActivityListener() {
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
currentActivity = activity;
// 将监听到创事件Activity加入集合
ActivitySuperviseUtils.pushActivity(activity);
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
// 将监听到销事件Activity移除集合
ActivitySuperviseUtils.finishActivity(activity);
}
});
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(base);
}
public Activity getCurrentActivity() {
return currentActivity;
}
}
主代码
final Activity currentActivity = App.getInstance().getCurrentActivity();
// FIXME: 2019/1/4 此处偶Bad window token,you cannot show a dialog before an Activity is created or after it's hidden。原因未知,暂如下处理。
if (!currentActivity.hasWindowFocus()) {
View view = currentActivity.getWindow().getDecorView();
view.setFocusable(true);
view.setFocusableInTouchMode(true);
view.requestFocus();
}
日志
偶现。如内存泄漏提示框出现于页面,消失后用全局Activity时报错:
Bad window token,you cannot show a dialog before an Activity is created or after it's hidden
方案一
无效
final Activity currentActivity = App.getInstance().getCurrentActivity();
// FIXME: 2019/1/4 此处偶Bad window token,you cannot show a dialog before an Activity is created or after it's hidden。原因未知,暂如下处理。
if (!currentActivity.hasWindowFocus()) {
View view = currentActivity.getWindow().getDecorView();
view.setFocusable(true);
view.setFocusableInTouchMode(true);
view.requestFocus();
}
方案二
有效
/**
* 栈顶Activity实例
*
* @return 栈顶Activity实例
*/
public static Activity getTopActivityInstance() {
Activity mBaseActivity;
synchronized (ACTIVITIES) {
final int size = ACTIVITIES.size() - 1;
if (size < 0) {
return null;
}
mBaseActivity = ACTIVITIES.get(size);
}
return mBaseActivity;
}
其它场景
其它场景报上错可重写下法:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
// TODO Auto-generated method stub
super.onWindowFocusChanged(hasFocus);
}