辉夜的博客

繁花似锦,辉夜如昼

0%

Android学习笔记(二)

在Activity间传递参数

写了个小脚本解决虚拟机频繁锁死的问题:

1
del C:\Users\huiyeruzhou\.android\*.lock

这下一键开锁了(
在Activity间传递参数的方法很简单,在Intnet里把参数压进去就可以了(此时还没有详细讲解什么是Intent):

1
2
3
4
public void onClick(View view) {
Intent i = new Intent(MainActivity.this, TheAty.class);
i.putExtra("data","qaq!QAQ__");
startActivity(i);}

intent传递参数的方式是键值对,值可以传很多类型,包括基本类型、数组、字符串等。
接收的方法也很简单:

1
2
3
Intent i =getIntent();
tv = findViewById(R.id.viewview);
tv.setText(i.getStringExtra("data"));

这里的”data”就是之前数据的名称。通过名称可以找到字符串,并且通过setText方法显示在文本框里。

使用Bundle传递多个参数

Bundle的使用方法和基本类型是类似的,先新建一个Bundle对象,然后调用对象的put<DataType>方法
再调用Intent对象的putExtras方法传递Bundle即可,接收的方法也是类似的:

1
2
3
4
5
6
Intent i = new Intent(MainActivity.this, TheAty.class);
Bundle b = new Bundle();
b.putString("data","qaq?QAQ>_<");
b.putInt("emm",611);
i.putExtras(b);
startActivity(i);

接收Bundle的数据时,可能会存在某个键无法在Bundle中找到对应值得情况,这种情况下Bundle类提供了
get<DataType>的重载方法以指定默认值:

1
2
3
tv.setText(String.format("%s,%d,%s",
b.getString("data"),b.getInt("emm"),
b.getString("ne!","abab")));//"ne!"对应的值不存在,显示为默认值"abab"

此外,Bundle也可以直接通过putExtra方法进行传递,这种情况可能适用于有多个Bundle的情况,此时
接受时也要使用getBundleExtra方法来进行查找。

传递值对象

Activity的启动模式

首先来看标准启动模式,也是默认的启动模式。我们来新建一个项目来演示不同的启动模式。首先为MainActivity添加一个TextView,两个Button
新建一个活动,叫做AnotherActivity,复制MainActivity的布局文件

java代码中设置TextView要显示的内容

1
tv.setText(format("Task ID:%d\nCurrent Instance id:%s",getTaskId(),this.toString()));

Task ID是任务栈id,而当前示例ID则是当前对象的地址,可以用来区分activity的示例。

接下来设置两个按钮,一个启动MainActivity一个启动AnotherActivity,复制上述代码到AnotherActivity.java,注意修改intent中package context为AnotherActivity.this,效果如图

接下来可以点按钮试试,可以观察到TaskId都是一样的,而实例的id是不同的,这就意味着点击按钮会创建新的示例,而且所有的示例都位于一个任务栈中。

在标准的启动模式中,我们启动一个Activity就会压栈一个新的实例,点击返回键就会弹栈。多次点击app的创建示例按钮,再按返回键,可以观察到他们依次被销毁的过程。

可以在AndroidManifest.xml文件中的Activity标签下添加Android:launchMode条目来指定启动模式,如果没有这个条目,则默认为Standard。

SingleTop启动模式

SingleTop,顾名思义,如果该活动的一个实例位于栈顶,就不能继续创建该活动的新实例。只有当栈顶实例不为该活动时,才能创建该活动的新实例。
下面在AndroidManifest.xml文件中配置MainActivity的启动模式为SingleTop.

1
2
3
4
 <activity
android:name=".MainActivity"
android:exported="true"
+ android:launchMode="singleTop">

启动程序,首先点击启动A活动按钮,应用没有反应。此时如果点击返回键会直接退出。
如果启动程序后先点击启动B活动按钮,再点击启动A活动按钮,可以发现这次成功的创建了A的新实例。这是因为创建了B活动之后,A活动的上一个实例已经不在栈顶,因此可以创建新的实例。

SingleTask模式

在这种情况下,一个任务栈中只能有一个该任务的实例,如果试图创建新实例,将会弹出所有位于该实例上的活动实例。
修改AndroidManifest文件,将启动模式修改为singleTask,启动应用程序。
点击启动A活动按钮,没有反应。点击启动B活动按钮,再点击启动A活动按钮,可以看到B活动退出,而显示的A活动正是第一个示例,如果此时再点击返回键,应用直接退出,说明所有B活动的示例都因为其位于A活动上方而被弹出了。

SingleInstance模式

在这种情况下,全局只有该活动的一个实例,第一次创建该活动时会创建一个新的任务栈,并且一个任务栈中只有这一个activity,而其他活动的实例会位于新的任务栈中。这种情况下,试图启动该活动的新实例时,会切换到保存该活动实例的任务栈。其他的任务栈不受影响。

SingleInstancePerTask