Android应用开发1: Context 使用

Reference:

1,http://guides.codepath.com/android/Using-Context  

2,http://blog.csdn.net/qinjuning/article/details/7310620

3,http://www.cnblogs.com/wenjiang/archive/2012/10/15/2724923.html

4,http://blog.csdn.net/yanbober/article/details/45967639

一,什么是Context

A Context provides access to information about the application state. It provides Activities, Fragments, and Services access to resource files, images, themes/styles, and external directory locations.

It also enables access to Android's built-in services,such as those used for layout inflation, keyboard, and finding content providers.

从Context的定义来看,Context提供以下几个功能:

1 提供访问应用程序状态的信息;

2 提供Acitivities, Fragments,Services 访问 Resource,images,themes/styles 外部目录的接口;

3 提供访问Android内部服务的接口:layout inflation, input 与及 content providers


二, Context的分类:根据生命周期区分

1 Acitivity-Context:该Context随着Activity的销毁而销毁;service-Context的生命周期也是这种。

2 Application-Context:该Context会伴随着整个Application,可以将Application-Context 的生命周期看做是整个应用。

当Activity销毁,Application-Context仍然存在;但是如果Activity中的某些资源文件包括images是与Application-Context相关;

这些资源文件不会因为Activity的销毁而被释放,从而引起了内存泄漏。

,Application-Context使用: 获取全局的context:getApplicationContext()

参考例子:

public Class myApplication extends Application{
 private static Context mContext;
        myApplication() { mContext = this; }
        public static Context getApplicationContext()
       {
            return mContext;
       }
}

同时需要在AndroidManifest.xml

<application android:name=".exampleApplication"></application>

: Activity-Context :Acitivity-Context 的生命周期伴随Activity

在一个 Activity 中可以使用 this就可以获取当前 Activity Context

Toast.makeText(this, s, Toast.LENGTH_LONG).show()。

上述的例子this就是当前的Activity-Context。但是如果在匿名内部类使用this,是会出错的。因为内部类中使用this得到的是内部类的对象引用而不是我们要的外部类。

因此必须使用类名.this这种方式这种做法在按钮的事件监听中需特别注意。

还有一个小错误

public class MainActivity extends AppCompatActivity {

    public final static String TAG  = "richard";
    public Button buttonContext;
    public Intent intent  = new Intent(MainActivity.this, ContextActivity.class);
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        buttonContext = (Button) findViewById(R.id.button_context);
        buttonContext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d(TAG, "============== button Context clicked ============= ");
                //intent  = new Intent(MainActivity.this, ContextActivity.class); //要指定MainActivity.this。不能直接使用this
                startActivity(intent);
            }
        });
    }
}

提示红色出出现 NULL 指针原因是Activity 只有跑了构造函数或者跑到onCreate() 之后才会创造Activity-Context

, Context什么时候创建

创建Application对象时而且整个APP共享一个全局的Application Context;

创建Activity对象时

创建Service对象时

所以总的Context个数 = Service个数 + Activity个数 + 1(Application Context)

,Context 深入补充

Context的继承关系图如下:

  

由继承关系可以看到,ServiceApplication的类均从ContextWrapper直接继承;Activity则从ContextThemeWrapper继续这是因为Activity是负责UI界面的显示需要Theme主题。

,Context的使用引起的内存泄露

譬如一个单例模式的自定义数据库管理工具类需要传入一个Context,而这个数据库管理对象又需要在Activity中使用如果我们传递ActivityContext就可能造成内存泄漏因为Activity可能已经销毁但是Context需要被使用无法释放),所以需要传递ApplicationContext


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值