手记

全局获取Context的技巧

有很多地方都需要用到Context,弹出Toast的时候需要,启动活动的时候需要,发送广播的时候需要,操作数据库的时候需要,使用通知的时候需要等等。

目前或许你还没有为得不到Context而发愁过,因为我们很多操作都是在活动中进行的,而活动本身就是一个Context对象。但是,当应用程序的架构逐渐开始复杂起来的时候,很多的逻辑代码都将脱离Activity类,但此时你又恰恰需要使用Context,这个时候你就会伤脑筋了。

下面我们就来学习一种技巧,让你在任何地方都能够轻松获得Context。

Android提供了一个Application类,每当应用程序启动的时候,系统就会自动将这个类进行初始化。而我们可以定制一个自己的Application类,以便于管理程序内一些全局的状态的信息,比如说全局Context。

定制一个自己的Application其实并不复杂,首先我们需要创建一个MyApplication类继承自Application,例如:

package com.example.webviewapplication;

import android.app.Application;
import android.content.Context;

public class MyApplication extends Application {
    private static Context context;

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

可以看到,MyApplication中的代码十分简单。这里我们重写了父类的onCreate()方法,并通过调用getApplicationContext()方法得到一个应用程序级别的Context,然后又提供了一个静态的getContext()方法,在这里将刚才获取到的Context进行返回。

接下来我们需要告知系统,当程序启动的时候就应该初始化MyApplication类,而不是默认的Application类。这一步也很简单,在AndroidManifest.xml文件的《application》标签下进行指定就可以了。

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    
    android:theme="@style/AppTheme">

这里记得要用完整的包名。

这样我们就已经实现了一种全局获取Context的机制,之后不管你想在项目的任何地方使用Context,只需要调用一下MyApplication.getContext()就可以了。例如:

package com.example.webviewapplication;

import android.widget.Toast;

import okhttp3.OkHttpClient;
import okhttp3.Request;

public class HttpUtil {
    public static void sendOkHttpRequest(String address,okhttp3.Callback callback){
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(address)
                .build();
        client.newCall(request).enqueue(callback);
        Toast.makeText(MyApplication.getContext(), "成功啦", Toast.LENGTH_SHORT).show();

    }
}

为了防止与LitePal起冲突,可以在自己的Application中去调用LitePal的初始化方法:

import android.app.Application;
import android.content.Context;

import org.litepal.LitePal;

public class MyApplication extends Application {
    private static Context context;

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


0人推荐
随时随地看视频
慕课网APP