zoukankan      html  css  js  c++  java
  • Context是什么,怎么用

    一.Context是什么

    开始学安卓的时候发现经常有context,但是都不知道为什么,什么时候需要它。

    官方文档概述:关于应用程序环境的全局信息的接口。这是一个抽象类,它的实现是由安卓系统提供的。它允许访问应用程序特定的资源和类,以及应用级的操作,如启动活动,电话,广播和接收的意图,等等。 我感觉可以把context比喻成一个游乐园,你要玩过山车,海盗船这些就要在游乐园中玩。

    继承关系

    image

    二.ContextWrapper与ContexImpl

    ContextWrapper提供一系列方法。这样继承于它的Application,Service,Activitykey直接从它取得对应的方法。但是它的方法是空壳,具体功能由ContextImpl实现。

    三.Application,Service,Activity

    它们三者的对象就是一个context。因此在MainActivity中需要进行数据操作的时候的时候这样写

    Editor editor = getSharedPreferences("Alarm", MODE_PRIVATE).edit();

    但是在一个继承于LinearLayout的子类中,则需要这样写

    Editor editor = getContext().getSharedPreferences("Alarm", Context.MODE_PRIVATE).edit();

    因此,在MainActivity中,有时候需要传入Context的对象,可以看到直接用MainActivity.this 结合闹钟那个项目,在添加闹钟的时候

    private void addAlarm(){
    //添加一句输出
    Log.d("Context", getContext()+"");
    ...
    }

    会发现这里的context是MainActivity

    四.Context能力不一样

    文档提到,可以通过context来进行多项操作,但是不同的Context能力范围不一样,游乐园也有大小区别嘛。
    Conext能做的通用操作决定于这个context最初来源于哪里。下表所列的是,在应用中常见的会收到context对象的,以及对应的每种情况,它可以用于哪些地方:

     image

    • NO1 表示Application context的确可以开始一个Activity,但是它需要创建一个新的task。这可能会满足一些特定的需求,但是在你的应用中会创建一个不标准的回退栈(back stack),这通常是不推荐的或者不是是好的实践。
    • NO2 表示这是非法的,但是这个填充(inflation)的确可以完成,但是是使用所运行的系统默认的主题(theme),而不是你app定义的主题。
    • NO3 在Android4.2以上,如果Receiver是null的话(这是用来获取一个sticky broadcast的当前 值的),这是允许的。

    这可以结合安卓的那个闹钟项目

    public class AlarmReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            ...
            Log.d("Context", getContext()+"");
            //启动响闹钟的界面
            Intent i = new Intent(context, PlayMusic.class); 
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
        }
    
    }

    可以发现这里的Context是ReceiverRestrictedContext,因此需要创建一个新的task

    详细阅读:

    1. http://blog.csdn.net/cswhale/article/details/38958595
    2. http://blog.csdn.net/race604/article/details/9331807
  • 相关阅读:
    检测用户名和密码
    文本框赋值-数组的使用
    表单元素属性应用
    innerText和textContent区别以及兼容处理
    1.1自动化测试
    coockie & session
    springMVC 实现上传文件和下载文件
    el 表达式 显示错误 总结
    杭电oj_2063——过山车(java实现)
    关于java静态存储类的一个知识点
  • 原文地址:https://www.cnblogs.com/Mihai/p/5601496.html
Copyright © 2011-2022 走看看