思否学否

Android基础知识—Context理解及使用

Context是Android中一个非常重要的概念,用于访问全局信息,几乎所有的基础组件都继承自 Context,理解 Context 对于学习 Android 四大基本组件非常有帮助。

1. Context作用

新建一个LearnContext工程,看如何通过Context来进行资源的访问。

public class MainActivity extends AppCompatActivity {
    private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        tv = new TextView(MainActivity.this); //可只写this
//        tv.setText("Hello Android");
        tv.setText(R.string.app_name); //利用资源的id传入一个字符串
        System.out.println(getResources().getText(R.string.app_name));  // 当前的avtivity是一个Context,所以直接通过getResources()获取资源
        setContentView(tv);
    }
}

除了可以获取字符串资源外,它还可以获取只要工程文件里边存在任意类型的资源。比如说图片资源:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ImageView iv = new ImageView(this);
        iv.setImageResource(R.mipmap.ic_launcher);
        setContentView(iv);
    }
}

这样运行就会看到安卓机器人的图片了
Context作用:访问全局信息的接口,比如全局的字符串,图片资源等。

2. Application用途

多个组件之间数据共享,前面了解了Context可以作为全局信息的桥梁。
新建一个类App,让它继承至Application,配置AndroidMainfset:

<application
    android:name=".App"  //new add

通过这种方式,我们就自定义了 Android 的 Application 。而 Application 才是一个真正的全局上下文对象。

App.java
public class App extends Application {
    private String textData = "default";
    public void setTextData(String textData) {
        this.textData = textData;
    }
    public String getTextData() {
        return textData;
    }
}

然后新建一个类 Main2 继承至 Activity,重写 onCreate()。添加注册信息:

把这个Activity也设置为启动的。
<activity 
    android:name=".Main2"
    android:label="Main2">  //同时将第一个Aty的label设为Main1。
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

运行发现手机已经装了MainActivityMain2,打开MainActivity为图片,打开Main2为空白。

接下来在layout文件夹中创建 main1.xml 和 main2.xml ,并绑定视图。

 

MainActivity.java
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main1);
    }
}
Main2.java
public class Main2 extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main2);
    }
}

回到 main1.xml,拖进一个 PlainTextView,PlainText 和 Button:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="New Text"
    android:id="@+id/textView" />
<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/editText"
    android:layout_gravity="center_horizontal" />
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="保存"
    android:id="@+id/btnSaveData" />

拷贝一份到main2.xml使用相同布局,去到MainActivity.java

 

public class MainActivity extends AppCompatActivity {
    private TextView textView;
    private EditText editText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main1);
        textView = (TextView) findViewById(R.id.textView); //获取资源
        editText = (EditText) findViewById(R.id.editText);
        textView.setText("共享的数据是:"+getApp().getTextData());
        findViewById(R.id.btnSaveData).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//保存时获取Application,类型为自定义的App,获取信息保存到全局的Context里边
((App)getApplicationContext()).setTextData(editText.getText().toString());
 textView.setText("共享的数据是:"+getApp().getTextData());
            }
        });
    }
    public App getApp(){
        return (App) getApplicationContext();
    }
}
同样的代码添加一份到 Main2.java 。
运行可以看到共享数据是 default,输入 wshlin ,点保存,可以看到共享数据变为 wshlin 。退出打开Main2,看到共享的数据为 wshlin,修改为kkk,退出打开Main,发现共享数据为 kkk。
也就是说,在多个 activity 里边,我们可以使用 Application 来进行数据的共享。因为 Application 对于同一个应用来说是唯一的。

====================================转载========================

作者:wshlin
链接:https://www.jianshu.com/p/cba902e68481
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted on 2019-12-06 22:29  思否学否  阅读(793)  评论(0编辑  收藏  举报