Android Intent 传参 - Application 对象
如果是传递简单的数据,有这样的需求
Activity1 -> Activity2 -> Activity3 -> Activity4
我们想要在 Activity1
中传递某个数据到 Activity4
中,怎么破,一个个页面传么?
显然很不一般的样子
换个思路,如果想某个数据可以在任何地方都能获取到,那么你肯定不假思索的说出 定义一个全局对象
Android 中也有这样的全局对象,那就是 Application
Application 对象
Android
系统在每个程序运行的时候创建一个 Application
对象,而且只会创建一个,所以 Application
是单例(singleton)模式的一个类
而且 Application 对象的生命周期是整个程序中最长的,它的生命周期等于这个程序的生命周期,我们可以用它来存储一些静态的值(固定不改变的,也可以变)
想用 Application
就需要自定义类实现 Application
类,并且告诉系统实例化的是我们自定义的 Application
而非系统默认的
而这一步,就是在 AndroidManifest.xml
中为我们的 application
标签添加: name 属性
注意
Application
对象是存在于内存中的,也就有它可能会被系统杀死,所以,不适合存放永久性数据
范例
我们用一个 报数 的 demo 来演示下 Application 对象传参
-
创建一个 空的 Android 项目
cn.twle.android.ApplicationIntent
-
修改
activity_main.xml
添加一个<Button>
和 一个<TextView>
<?xml version="1.0" encoding="utf-8" ?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/cnt" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="0" /> <Button android:id="@+id/btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="小明,你报数" /> </LinearLayout>
-
在
MainActivity.java
目录下新建一个MsApplication.java
Applicaiton 是系统的一个组件,它也有自己的一个生命周期,我们可以在
onCraete()
里获得这个 Application 对象package cn.twle.android.applicationintent; import android.app.Application; public class MsApplication extends Application { private int cnt = 0; private int type = 0; private static MsApplication instance; public static MsApplication getInstance(){ return instance; } public int getCnt(){ return cnt; } public int getType() { return type; } public void setCnt(int cnt ){ this.cnt = cnt; } public void setType(int type) { this.type = type; } @Override public void onCreate(){ super.onCreate(); instance = this; } }
-
修改
AndroidManifest.xml
<application android:name=".MsApplication" ...>
-
修改
MainActivity.java
package cn.twle.android.applicationintent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.content.Intent; import android.content.Context; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final Context mContext = MainActivity.this; TextView tv_cnt = (TextView) findViewById(R.id.cnt); Button btn = (Button) findViewById(R.id.btn); // 获取单例实例 MsApplication mAPP = MsApplication.getInstance(); int cnt = mAPP.getCnt(); int type = mAPP.getType(); cnt++; tv_cnt.setText(String.valueOf(cnt)); if (type == 1 ) { btn.setText("小红,轮到你了"); type = 0; } else { btn.setText("小明,你报数"); type = 1; } mAPP.setCnt(cnt); mAPP.setType(type); btn.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { Intent it = new Intent(mContext,MainActivity.class); startActivity(it); } }); } }