Android程序中访问资源时需要提供Context,一般来说只有在各种component中(Activity, Provider等等)才能方便的使用api来获取Context, 而在某些工具类中要获取就很麻烦了。为此,我们可以自定义一个Application类来实现这种功能。

import android.app.Application;public class MyApplication extends Application {private static MyApplication instance;public static MyApplication getInstance() {return instance;}@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();instance = this;}}

然后在manifest中<application>中加入name="mypackage.MyApplication"就可以在任意类中使用MyApplication.getInstance()来获取应用程序Context了。

获取别的包的context

Android中有Context的概念,想必大家都知道。Context可以做很多事情,打开activity、发送广播、打开本包下文件夹和数据库、获取classLoader、获取资源等等。如果我们得到了一个包的Context对象,那我们基本上可以做这个包自己能做的大部分事情。
那我们能得到吗?很高兴的告诉你,能!
Context有个createPackageContext方法,可以创建另外一个包的上下文,这个实例不同于它本身的Context实例,但是功能是一样的。


这个方法有两个参数:
1。packageName 包名,要得到Context的包名
2。flags 标志位,有CONTEXT_INCLUDE_CODE和CONTEXT_IGNORE_SECURITY两个选项。

CONTEXT_INCLUDE_CODE的意思是包括代码,也就是说可以执行这个包里面的代码。

CONTEXT_IGNORE_SECURITY的意思是忽略安全警告,如果不加这个标志的话,有些功能是用不了的,会出现安全警告。


下面给个小例子,执行另外一个包里面的某个类的方法。
另外一个包的包名是chroya.demo,类名Main,方法名print,代码如下:

package chroya.demo;      import android.app.Activity;   import android.os.Bundle;   import android.util.Log;      class Main extends Activity {              @Override       public void onCreate(Bundle savedInstanceState) {           super.onCreate(savedInstanceState);       }              public void print(String msg) {           Log.d("Main", "msg:"+ msg);       }   }   package chroya.demo;import android.app.Activity;import android.os.Bundle;import android.util.Log;class Main extends Activity {  @Override public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState); }  public void print(String msg) {  Log.d("Main", "msg:"+ msg); }}

本包的调用Main的print方法的代码块如下:

Context c = createPackageContext("chroya.demo", Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);   //载入这个类   Class clazz = c.getClassLoader().loadClass("chroya.demo.Main");   //新建一个实例   Object owner = clazz.newInstance();   //获取print方法,传入参数并执行   Object obj = clazz.getMethod("print", String.class).invoke(owner, "Hello");   Context c = createPackageContext("chroya.demo", Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);//载入这个类Class clazz = c.getClassLoader().loadClass("chroya.demo.Main");//新建一个实例Object owner = clazz.newInstance();//获取print方法,传入参数并执行Object obj = clazz.getMethod("print", String.class).invoke(owner, "Hello");

ok,这样,我们就调用了chroya.demo包的Main类的print方法,执行结果,打印出了Hello。

怎么样,这只是一个调用其他包的代码的例子,我们获取到Context,还可以做很多事情,当然,题目所说的坏事,还是不要做为好。

更多相关文章

  1. Android(安卓)SDK离线安装方法详解(加速安装)
  2. 分享一个 Android(安卓)全局获取 Context 的类(无需配置 Applicat
  3. Android(安卓)Handler.removeMessage移除所有postDelayed的问题
  4. Android代码混淆与加固技术一
  5. 阿里Android(安卓)26条规范经验及优化
  6. Android(安卓)Studio一些使用快捷键
  7. Android中存储目录
  8. Unity Android(安卓)Usb 通信
  9. android操作SQLite

随机推荐

  1. ToggleButton控件
  2. Android(安卓)源码下载
  3. 【转】Android中Webview使用经验总结
  4. Android(安卓)Studio 编译 freso问题
  5. android 时间获取以及时间格式化
  6. Android(安卓)回调详解及简单实例
  7. android简单实现短信拦截
  8. [android]fmodex在某些android设备上声音
  9. android中JSON的使用
  10. android 电池(一):锂电池基本原理篇