全局

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
}

猜你喜欢

转载自blog.csdn.net/zsp_android_com/article/details/86079708
今日推荐