Android基础-06 Activity页面跳转和数据传递
01_AndroidManifest文件中的几个细节
在Android应用程序中一个activity就对应了一个界面。
结论:
1、一个应用程序可以有多个桌面图标;
2、创建快捷图标的方法:
<intent-filter>
//main 应用程序的入口
<action android:name="android.intent.action.MAIN" />
//LAUNCHER 启动器
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
3、activity节点中label的值就是桌面图标的名称;
4、activity节点中label的值就是界面标题的(值)名称;
5、应用程序的名称可以在应用程序的管理列表中看到,application节点中的label标签和activity中的label标签不是一个概念,application节点中的label标签表示应用程序的名称。
02_意图设置动作激活新的界面(重点)
从第一个界面跳转到第二个界面:
Intent意图:做一件事情的想法;
Intent意图的作用:激活组件和携带参数;
意图包含要素:
动作、数据;
吃饭:动作、数据
打人:动作、数据
泡茶:
泡妞:动作、数据
模版代码:
//创建一个开启第二个界面的意图
Intent intent = new Intent();
//设置目标activity的动作
intent.setAction("com.itheima..multiview.SECONDSHOW");
//设置目标activity的数据
intent.setData(Uri.parse("itheima://110"));
//设置目标activity的类型
intent.addCategory("android.intent.category.DEFAULT");
//开启一个新的界面
startActivity(intent);
03_意图设计的目的
意图设计的目的:解耦;
解耦:要求写的代码模块或者方法能够独立运行和彼此相互调用;
架构师、构架师:多快好省的完成一个项目;
代码:
private WebView wv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//得到浏览器对象
wv = (WebView) findViewById(R.id.wv);
//设置浏览器不缓存数据
WebSettings settings = wv.getSettings();
settings.setAppCacheEnabled(false);
//得到其他组件或应用程序传递过来的intent对象
Intent intent = getIntent();
Uri uri = intent.getData();
if(uri != null){
//得到其他应用程序传递过来的url地址
String url = uri.toString();
//使用浏览器打开一个页面
wv.loadUrl(url);
}
}
04_隐式意图和显式意图(重点)
1、隐式意图:
在开启目标activity时,不需要直接指定目标activity的名称,通过指定一组动作、数据、类型等属性,让系统从清单文件中匹配指定的acitivity来开启activity。
模版代码:
//创建一个开启第二个界面的意图
Intent intent = new Intent();
//设置目标activity的动作
intent.setAction("com.itheima..multiview.SECONDSHOW");
//设置目标activity的数据
intent.setData(Uri.parse("itheima://110"));
//设置目标activity的类型
intent.addCategory("android.intent.category.DEFAULT");
应用场景:开启其他应用程序中的组件时使用隐式意图;
2、显式意图:
在开启目标activity时需要直接指定目标activity名称;
模版代码:
//创建一个显示意图开启第二个界面
Intent intent = new Intent(this, SecondActivity.class);
//开启一个新的界面
startActivity(intent);
应用场景:开启应用程序内部的activity;
05_意图传递数据(重点)
从第一个界面传递一些数据给第二个界面,在第二个界面上显示出来;
intent可以传递的数据类型:
八大基本类型及其数据:
parcelable
Serializable
Bundle
putExtras(Bundle);
代码:
传递数据:
//创建一个显示意图开启第二个界面
Intent intent = new Intent(this, SecondActivity.class);
//把需要提交的数据封装到意图对象中
// intent.putExtra("name", "itheima");
// intent.putExtra("age", 4);
//
Bundle b = new Bundle();
b.putString("name", "itheima");
b.putInt("age", 4);
intent.putExtra("info", b);
//开启一个新的界面
startActivity(intent);
接收数据:
Intent intent = getIntent();
//
// String name = intent.getStringExtra("name");
// int age = intent.getIntExtra("age", 0);
Bundle b = intent.getBundleExtra("info");
String name = b.getString("name");
int age = b.getInt("age");
tv.setText("name:"+name+";age:"+age);
06_URI介绍
url: http://www.baidu.com/image/1.jpg
URI的组成部分:
1、scheme:协议的名称,content,tel;
2、主机名:
3、路径:
4、访问的资源数据:
07_开启activity获取返回值(重点)
从第一个界面跳转到第二个界面上,当第二个界面关闭的时候给第一个界面返回一些数据,在第一个界面显示返回的数据。
1、从第一个界面跳转到第二个界面上,期待第二个界面返回数据;
2、在第二个界面关闭之前设置返回的数据,当第二个界面关闭时返回数据:
3、在第一个界面显示返回的数据:
MainActivity.java:
package com.itheima.multiview;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
/**
* 在avtivity实例一创建的时候就会调用这个方法
* 初始化avtivity实例
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载界面的布局文件
setContentView(R.layout.activity_main);
}
public void jump(View view){
//创建一个显示意图开启第二个界面
Intent intent = new Intent(this, SecondActivity.class);
//开启一个新的界面,期待目标activity返回数据
// startActivity(intent);
startActivityForResult(intent, 0);
}
//接收目标activity返回的数据
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
String info = data.getStringExtra("info");
Toast.makeText(this, info, 0).show();
}
}
SecondActivity.java:
package com.itheima.multiview;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class SecondActivity extends Activity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载界面的布局文件
setContentView(R.layout.activity_second);
tv = (TextView) findViewById(R.id.tv);
}
public void return01(View view){
//设置返回的数据,
Intent data = new Intent();
data.putExtra("info", "我是从第二个界面返回的数据");
//当界面关闭时调用这个方法生效
setResult(100, data);
//关闭当前界面
finish();
}
}
08_请求码和结果码的作用(重点)
请求码和结果码的作用:用来当前数据是从哪个业务逻辑界面返回的。
代码:
MainActivity.java:
package com.itheima.multiview;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
/**
* 在avtivity实例一创建的时候就会调用这个方法
* 初始化avtivity实例
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载界面的布局文件
setContentView(R.layout.activity_main);
}
public void jump(View view){
//创建一个显示意图开启第二个界面
Intent intent = new Intent(this, SecondActivity.class);
//开启一个新的界面,期待目标activity返回数据,设置了请求码
// startActivity(intent);
startActivityForResult(intent, 0);
}
public void jump02(View view){
//创建一个显示意图开启第二个界面
Intent intent = new Intent(this, ThirdActivity.class);
//开启一个新的界面,期待目标activity返回数据,设置了请求码
// startActivity(intent);
startActivityForResult(intent, 1);
}
//接收目标activity返回的数据
//requestCode 请求码,是在开启目标activity时设置的
//resultCode 结果码 ,是在目标activity设置返回数据时设置的
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// switch (requestCode) {
// case 0:
// String info = data.getStringExtra("info");
// Toast.makeText(this,"从第二个界面返回的数据是:"+ info, 0).show();
// break;
// case 1:
//
// String info1 = data.getStringExtra("info");
// Toast.makeText(this,"从第三个界面返回的数据是:"+ info1, 0).show();
// break;
// }
switch (resultCode) {
case 100:
String info = data.getStringExtra("info");
Toast.makeText(this,"从第二个界面返回的数据是:"+ info, 0).show();
break;
case 300:
String info1 = data.getStringExtra("info");
Toast.makeText(this,"从第三个界面返回的数据是:"+ info1, 0).show();
break;
}
}
}
SecondActivity.java:
package com.itheima.multiview;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class SecondActivity extends Activity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载界面的布局文件
setContentView(R.layout.activity_second);
tv = (TextView) findViewById(R.id.tv);
}
public void return01(View view){
//设置返回的数据,
Intent data = new Intent();
data.putExtra("info", "我是从第二个界面返回的数据");
//当界面关闭时调用这个方法生效
setResult(100, data);
//关闭当前界面
finish();
}
}
09_activity的生命周期(重点)
生命周期:在生命的整个期间,经历一些阶段,在每个界面都会调用的相应的方法(方法的回调)。
暗恋、初恋、热恋、痴恋、失恋;
onCreate:初始化;
onStart:开始activity,界面可见时调用这个方法;
onResume:获得界面焦点;
onPause:失去界面焦点;
onStop:界面不可见;
onRestart:重新开始打开一个界面;
onDestroy:在销毁实例对象之前调用这个方法;
10_读文档查看activity的生命周期
整体生命周期:onCreate、onStart、onResume、onPause、onStop、onDestroy;
可视化的生命周期:onStart、onResume、onPause、onStop;
前置生命周期:onResume、onPause;
11_横竖屏切换的生命周期(重点)
横竖屏切换的生命周期:先关闭前面一个界面,打开一个新的界面;
1、设置屏幕的方向:设置screenOrientation="landscape",landscape横屏、portrait竖屏、sensor传感器类型(自适应);
2、设置切换屏幕方向时不调用生命周期的方法:configChanges="orientation|screenSize|keyboardHidden";
12_任务栈的概念
队列:先进先出;
栈:先进后出;
任务:activity的实例对象。
任务栈:用于存放任务的栈;
打开一个界面,在任务栈中存放对应的一个任务;关闭一个界面的时候,从任务栈中清除对应的任务;
当任务栈中的任务被 清除完了,表示应用程序退出了。
13_启动模式:
standard:标准模式,没打开一个界面都会创建一个实例放入任务栈中;
singleTop:单一顶部模式;
singletop启动模式
singletop 单一顶部模式 在activity的配置文件中设置android:launchMode="singleTop"
如果任务栈的栈顶存在这个要开启的activity,不会重新的创建activity,而是复用已经存在的activity。保证栈顶如果存在,不会重复创建。
应用场景:浏览器的书签
singletask和singleinstance启动模式
singetask 单一任务栈,在当前任务栈里面只能有一个实例存在;
当开启activity的时候,就去检查在任务栈里面是否有实例已经存在,如果有实例存在就复用这个已经存在的activity,并且把这个activity上面的所有的别的activity都清空,复用这个已经存在的activity。保证整个任务栈里面只有一个任务存在。
应用场景:浏览器的activity
如果一个activity的创建需要占用大量的系统资源(cpu,内存)一般配置这个activity为singletask的启动模式。webkit内核 c代码
singleInstance启动模式非常特殊, activity会运行在自己的任务栈里面,并且这个任务栈里面只有一个实例存在
如果你要保证一个activity在整个手机操作系统里面只有一个实例存在,使用singleInstance
应用场景: 电话拨打界面
15_应用程序签名打包
把应用程序的代码打包成apk;
给应用程序打包时使用签名的原因: 避免覆盖安装(如果应用程序的包名相同就会出现覆盖安装的情况;
keystore文件和密码一定要保存号。