在Activity间传递参数
写了个小脚本解决虚拟机频繁锁死的问题:
1 | del C:\Users\huiyeruzhou\.android\*.lock |
这下一键开锁了(
在Activity间传递参数的方法很简单,在Intnet里把参数压进去就可以了(此时还没有详细讲解什么是Intent):
1 | public void onClick(View view) { |
intent传递参数的方式是键值对,值可以传很多类型,包括基本类型、数组、字符串等。
接收的方法也很简单:
1 | Intent i =getIntent(); |
这里的”data”就是之前数据的名称。通过名称可以找到字符串,并且通过setText方法显示在文本框里。
使用Bundle传递多个参数
Bundle的使用方法和基本类型是类似的,先新建一个Bundle对象,然后调用对象的put<DataType>
方法
再调用Intent对象的putExtras
方法传递Bundle即可,接收的方法也是类似的:
1 | Intent i = new Intent(MainActivity.this, TheAty.class); |
接收Bundle的数据时,可能会存在某个键无法在Bundle中找到对应值得情况,这种情况下Bundle类提供了get<DataType>
的重载方法以指定默认值:
1 | tv.setText(String.format("%s,%d,%s", |
此外,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
,效果如图
/2022-04-22-22-35-18.png)
接下来可以点按钮试试,可以观察到TaskId都是一样的,而实例的id是不同的,这就意味着点击按钮会创建新的示例,而且所有的示例都位于一个任务栈中。
在标准的启动模式中,我们启动一个Activity就会压栈一个新的实例,点击返回键就会弹栈。多次点击app的创建示例按钮,再按返回键,可以观察到他们依次被销毁的过程。
可以在AndroidManifest.xml文件中的Activity标签下添加Android:launchMode条目来指定启动模式,如果没有这个条目,则默认为Standard。
SingleTop启动模式
SingleTop,顾名思义,如果该活动的一个实例位于栈顶,就不能继续创建该活动的新实例。只有当栈顶实例不为该活动时,才能创建该活动的新实例。
下面在AndroidManifest.xml文件中配置MainActivity的启动模式为SingleTop.
1 | <activity |
启动程序,首先点击启动A活动按钮,应用没有反应。此时如果点击返回键会直接退出。
如果启动程序后先点击启动B活动按钮,再点击启动A活动按钮,可以发现这次成功的创建了A的新实例。这是因为创建了B活动之后,A活动的上一个实例已经不在栈顶,因此可以创建新的实例。
SingleTask模式
在这种情况下,一个任务栈中只能有一个该任务的实例,如果试图创建新实例,将会弹出所有位于该实例上的活动实例。
修改AndroidManifest文件,将启动模式修改为singleTask
,启动应用程序。
点击启动A活动按钮,没有反应。点击启动B活动按钮,再点击启动A活动按钮,可以看到B活动退出,而显示的A活动正是第一个示例,如果此时再点击返回键,应用直接退出,说明所有B活动的示例都因为其位于A活动上方而被弹出了。
SingleInstance模式
在这种情况下,全局只有该活动的一个实例,第一次创建该活动时会创建一个新的任务栈,并且一个任务栈中只有这一个activity,而其他活动的实例会位于新的任务栈中。这种情况下,试图启动该活动的新实例时,会切换到保存该活动实例的任务栈。其他的任务栈不受影响。