美文网首页
获取Context对象

获取Context对象

作者: 奈蜇 | 来源:发表于2018-11-01 15:42 被阅读0次

通常方法:

private static Context mContext; 
 public static Context getContext() {
       return mContext;
}
    @Override
    public void onCreate() {
        super.onCreate();
        mContext = this.getApplicationContext();
    }

我们会直接在Application中写一个static Context然后再onCreate赋值,由于Application在程序运行中只onCreate一次且伴随程序的生命周期,所以没很大问题的。
但是如果我们要随时的使用伴随Activity生命周期的Context怎么办呢。
这里我们采用WeakReference来一直持有当前显示页的Context。
在BaseActivity中去更新Application 中 保存Context的WeakReference,使其一直保存着显示页的Context。
话不多说直接上代码:
BaseApplication:


import android.annotation.SuppressLint;
import android.app.Application;
import android.content.Context;
import android.content.res.Configuration;

import java.lang.ref.WeakReference;

/**
 * Created by 奈蜇 on 2018-11-01.
 * BaseApplication
 */
public abstract class BaseApplication extends Application {
    private String TAG;

    @SuppressLint("StaticFieldLeak")
    private static Context mContext;
    private volatile static WeakReference<Context> mContextWeakReference = null;

    public static Context getContext() {
        if (mContextWeakReference == null || mContextWeakReference.get() == null) {
           synchronized (BaseApplication.class){
               if(mContextWeakReference == null || mContextWeakReference.get() == null){
                   mContextWeakReference = new WeakReference<>(mContext);
               }
           }
        }
        return mContextWeakReference.get();
    }
    public static void setContextRef(Context contextRef){
        mContextWeakReference = new WeakReference<>(contextRef);
    }


    @Override
    public void onCreate() {
        TAG = this.getClass().getName();
        LOG.D(TAG,"onCreate:" + this.toString());
        super.onCreate();
        mContext = this.getApplicationContext();
    }

    /**
     * 在开程序在内核中结束的时候执行,退出程序不一定会执行.
     */
    @Override
    public void onTerminate() {
        LOG.D(TAG,"onTerminate:" + this.toString());
        TAG = null;
        super.onTerminate();
    }

    /**
     * 配置改变时触发这个方法,例如屏幕方向切换.
     */
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }

    /**
     * 内存匮乏时会调用.
     */
    @Override
    public void onLowMemory() {
        super.onLowMemory();
    }

    /**
     * 每次计算进程优先级满足条件时会调用,回调不同的内存状态.
     */
    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
    }
}

BaseActivity:


import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

/**
 * Created by 奈蜇 on 2018-11-01.
 *  基础活动类
 */
public abstract class BaseActivity extends AppCompatActivity {
    private String TAG;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        TAG = this.getClass().getName();
        LOG.D(TAG, "onCreate:  " + this.toString());
        super.onCreate(savedInstanceState);
        BaseApplication.setContextRef(this);
    }

    @Override
    protected void onStart() {
        LOG.D(TAG, "onStart:  " + this.toString());
        super.onStart();
    }

    @Override
    protected void onResume() {
        LOG.D(TAG, "onResume:  " + this.toString());
        super.onResume();
        BaseApplication.setContextRef(this);//保证弱引用一直引用当前的可见页面
    }

    @Override
    protected void onPause() {
        LOG.D(TAG, "onPause:  " + this.toString());
        super.onPause();
    }

    @Override
    protected void onStop() {
        LOG.D(TAG, "onStop:  " + this.toString());
        super.onStop();
    }

    @Override
    protected void onRestart() {
        LOG.D(TAG, "onRestart:  " + this.toString());
        super.onRestart();
    }

    @Override
    protected void onDestroy() {
        LOG.D(TAG, "onDestroy:  " + this.toString());
        TAG = null;
        super.onDestroy();
    }
}

相关文章

  • 获取Context对象

    通常方法: 我们会直接在Application中写一个static Context然后再onCreate赋值,由于...

  • flutter的state

    1.获取父类的State通过Context获取context对象有一个findAncestorStateOfTyp...

  • Android Context与内存泄漏

    Context Context作用域 使用Context 通常我们想要获取Context对象,主要有以下四种方法 ...

  • jni反射java类SharePreference,实现本地持久

    /** 获取Context对象 @param env @return*/static jobject getApp...

  • Context

    1. 继承关系 2. 作用域 3. 获取Context 通常我们想要获取 Context 对象,主要有以下四种方法...

  • Android资源加载机制

    参考1参考2 获取资源的方式 先通过Context.getResources();获取Resources对象,有了...

  • Android 获取全局 Context 对象

    该方法主要是利用 Application 类,每当应用程序启动的时候,系统就会自动将这个类进行初始化。而我们就可以...

  • jQuery选择器

    一、获取jQuery对象的核心方法 1、jQuery(expression,[context]): (1)expr...

  • Flutter当前路由属性详解

      ModalRoute.of(context) API可以获取当前路由对象,通过它我们可以获取关于当前页面的所有...

  • 高级技巧

    全局获取Context 使用Intent传递对象 定制自己的日志工具 创建定时任务

网友评论

      本文标题:获取Context对象

      本文链接:https://www.haomeiwen.com/subject/jvdxxqtx.html