有很多地方都需要用到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; } }