这是我参与「第四届青训营 」笔记创作活动的第3天 今天笔记的内容是安卓activity详解
在Activity间传递参数
写了个小脚本解决虚拟机频繁锁死的问题:
del C:\Users\huiyeruzhou\.android\*.lock
这下一键开锁了( 在Activity间传递参数的方法很简单,在Intnet里把参数压进去就可以了:
public void onClick(View view) {
Intent i = new Intent(MainActivity.this, TheAty.class);
i.putExtra("data","qaq!QAQ__");
startActivity(i);}
intent传递参数的方式是键值对,值可以传很多类型,包括基本类型、数组、字符串等。 接收的方法也很简单:
Intent i =getIntent();
tv = findViewById(R.id.viewview);
tv.setText(i.getStringExtra("data"));
这里的"data"就是之前数据的名称。通过名称可以找到字符串,并且通过setText方法显示在文本框里。
使用Bundle传递多个参数
Bundle的使用方法和基本类型是类似的,先新建一个Bundle对象,然后调用对象的put<DataType>方法
再调用Intent对象的putExtras方法传递Bundle即可,接收的方法也是类似的:
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>的重载方法以指定默认值:
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要显示的内容
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.
<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,而其他活动的实例会位于新的任务栈中。这种情况下,试图启动该活动的新实例时,会切换到保存该活动实例的任务栈。其他的任务栈不受影响。