Android基础知识—Activity

一、认识Activity组件

Activity是Android 四大基本组件之一,可以通过 setContentView 方法绑定一个布局用于呈现界面与用户进行交互,是 Android 开发必不可少的学习内容。


二、Activity生命周期


三、在Activity之间传递参数

  1. 传递简单数据
    新建工程SendArgs,给activity_main.xml添加一个Button:

新建一个Activity名为TheAty,在TheAty.java的onCreate()添加:

    Intent i = getIntent(); 
    tv = (Text View) findViewById(R.id.tv);
    tv.setText(i.getStringExtra("data");

修改activity_the_aty.xml:


在MainActivity.java的onCreate()中添加:

findViewById(R.id.btnStarAty).setOnClickListener(new View.OnclickListener()
{
    @override
    public void onClick(View v){
        Intent i = new Intent(MainActivity.this,TheAty.class);
        i.putExtra("data", "come on!");
        startActivity(i);
    }
}

运行启动,点击启动另一个Activity就可以看到跳出另一个Activity并且文本显示come on!

  1. 传递复杂数据(数据包)
    还是之前的工程,修改MainActivity.java按钮事件监听器的代码:
public void onClick(View v){
    Intent i = new Intent(MainActivity.this, TheAty.class);
    Bundle b =new Bundle();
    b.putString("name", "lin");
    b.putInt("age", 23); 

    i.putExtras(b);                             // 方式1
    i.putExtra("data", b);                      // 方式2
    startActivity(i);
}

修改TheAty.java:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_the_aty);

    Intent i = getIntent();
    Bundle data = i.getExtras();               // 方式1
    Bundle data = i.getBundleExtra("data");    // 方式2

    tv = (TextView) findViewById(R.id.tv);
    tv.setText(String.format("name=%s, age=%d, name1=%s", data.getString("name"), data.getInt("age"), data.getString("name1", "leo")));
}

运行启动,点击启动另一个Activity就可以看到跳出另一个Activity并且文本显示name=lin,age=23,name1=leo

  1. 传递自定义值对象
    新建一个类User.java,序列化对象接口Serializable(java内部提供)和Parcelable(Android提供):
public class User implements Serializable // Parcelable
{
    private String name;
    Private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public User(String name, int age){
        this.name = name;
        this.age = age;
    }
}

还是之前的工程,修改MainActivity.java按钮事件监听器的代码:

public void onClick(View v){ {
    Intent i = new Intent(MainActivity.this, TheAty.class);
    
    i.putExtra("user", new User("lin",23));
    startActivity(i);
}

修改TheAty.java:

protected void onCreate(Bundle savedInstanceState) {
    Intent i = getIntent();
    tv = (TextView) findViewById(R.id.tv);

    User user = (User)  i.getSerializableExtra("user");
    //User user = (User)  i.getParcelableExtra("user");
    tv.setText(String.format("User info(name=%s, age=%d)", user.getName(), user.getAge()));
}

运行启动,点击启动另一个Activity就可以看到跳出另一个Activity并且文本显示User info(name=lin, age=23)
接下来使用Parcelable,修改User.java:

public class User implements Parcelable
{
    //其他不变
}
// 新添两个方法
@Override
public int describeContents() {
    return 0;
}
@Overrride
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(getName());
    dest.writeInt(getAge());
}
public static final Creator CREATOR = new CREATOR() {
    @Override
    public User createFromParcel(Parcel source) {
        return new User(source.readString(), source.readInt());
    }
    @Overrride
    public User newArray(int size) {
        return new User[size];
    }
};

运行启动,点击启动另一个Activity就可以看到跳出另一个Activity并且文本显示User info(name=lin, age=23)


四、Activity启动模式

在Android中Activity有四种启动模式. 每一种模式都代表着一种使用场合. 对四种启动模式有深入的了解才能在实际开发工作中得心应手,写出完美的程序.

  1. 标准启动模式(默认的启动模式)
    新建工程LauchMode,为activity_main.java中的添加id:

MainActivity.java
public class MainActivity extends AppCompatActivity {
    private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv = (TextView) findViewById(R.id.tv);
        tv.setText(String.format("TaskID:%d\nCurrent Activity id:%s",
                getTaskId(), toString())); // 任务栈的id和当前实例的id
    }
}

运行结果:

TaskID:1950
Current Activity id:com.lin.lauchmode.MainActivity@8695dad

之后更改布局


    android:orientation="vertical"

然后拖进一个Button

回到MainAcyivity.java在OnCreate()添加按钮的事件监听器:

findViewById(R.id.btnStarSelf).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        startActivity(new Intent(MainActivity.this, MainActivity.class));
    }
});

运行结果:

TaskID:1952
Current Activity id:com.lin.lauchmode.MainActivity@89806

点击一下Button:

TaskID:1952
Current Activity id:com.lin.lauchmode.MainActivity@f3232c0

可以看到TaskID是一样的,而后面的id是不一样的.也就是说此时所启动的程序在同一个任务栈里边,只是创建不同的实例而已.每当点击btn都会新创建出一个实例并放入任务栈中,后退又会回到之前的实例.也就是栈的作用,先进后出.通过这种方式可以支持后退键的导航.

在 AndroidMainfest.xml中更改启动模式


     //默认

  1. SingleTop模式
    修改AndroidMainfest.xml

    
    

运行结果:

TaskID:1954
Current Activity id:com.lin.lauchmode.MainActivity@89806

点击btn,文本没有丝毫变化,按回退键,程序退出.
接下来在创建一个ActivityBAty.

activity_baty.xml

BAty.java
public class BAty extends AppCompatActivity {
    private TextView tv;           // add
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_baty);

        tv = (TextView) findViewById(R.id.tv);   //add
        tv.setText(String.format("TaskID:%d\nCurrent Activity id:%s",
                getTaskId(), toString())); // add 任务栈的id和当前实例的id
    }

在A里面再添加一个按钮

回到MainActivity.java,再写一个监听器

findViewById(R.id.btnStarBAty).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        startActivity(new Intent(MainActivity.this, BAty.class));
    }
});

最后将activity_main.xml的内容拷贝到activity_baty.xml中.两个一样,然后将MainActivity.java的两个监听器拷贝到BAty.java.

修改当前启动的activity
startActivity(new Intent(BAty.this, BAty.class));

运行结果:

TaskID:1957
Current Activity id:com.lin.lauchmode.MainActivity@bc0e17f

按下启动MainActivity按钮,文本无改变.
按下启动BAty进入BAty,再按下启动MainActivity,注意此时的实例id改变:MainActivity@c4f080d.
singleTop意义: 也就是说在同一个栈里面指明singleTop模式下,当前实例位于栈顶时不会创建新的实例,反之可以.

  1. SingleTask与SingleInstance模式
    首先在修改AndroidMainfest.xml:
android:launchMode="singleTask"

运行结果:

TaskID:1960
Current Activity id:com.lin.lauchmode.MainActivity@bc0e17f

此时有一个任务栈,它的id为1960,然后这个任务栈里面有了一个activity是MainActivity.然后启动BAty,此时这个任务栈里面有了两个activity.第一个是MainActivity,第二个是BAty.然后此时我们启动MainActivity的话,它会把BAty给弹出.弹回到第一个activity实例,此时我们在摁后退键的话,程序就会退出------这就是singleTask的意义。
接下来我们修改AndroidMainfest.xml:

android:launchMode="singleInstance"

运行结果:

TaskID:1961
Current Activity id:com.lin.lauchmode.MainActivity@bc0e17f

启动MainActivity,没有变化,因为是同一个实例同一个任务栈.
启动BAty,可以看到BAty的TaskID:1962,已经不是同一个栈了.
也就意味着singleInstance只存在一个独立的任务栈里边,一个任务栈只包括这么一个activity.
反复点击两个按钮,你会发现两个actyvity在相互切换。

你可能感兴趣的:(Android基础知识—Activity)