一、如何创建一个新的Activity
- 安卓的四大组件都要在manifest.xml清单文件配置
- 如果想让应用有多个启动图标,需要配置清单文件为
<category android:name="android.intent.category.LAUNCHER" />
- Activity下的lable属性和icon属性可以和Application节点的属性不一样,默认用Application节点下的属性
- 一个Android应用下,我们配置一个启动图标即可,其他的页面都是从第一个页面跳转进去的
二、隐式意图(intent)
2-1.清单文件配置
节点配置
mimeType:设置数据类型
Set the data this intent is operating on. This method automatically clears any type that was previously set by setType or setTypeAndNormalize.
scheme:约束
This method automatically clears any data that was previously set (for example by setData).
[小细节]如果setData()和setType()一起使用的时候,要使用setDataAndType()
<data android:scheme="M"
android:mimeType="aa/bb"
/>
-----------------------------------------------------------
// 点击按钮实现页面跳转
public void click02(View v) {
// 创建意图对象
Intent intent = new Intent();
// 设置action
intent.setAction("android.intent.action.TEST_ACTIVITY");
//设置category
intent.addCategory("android.intent.category.DEFAULT");
/***************************************************
// 设置数据类型
intent.setType("aa/bb");
// 设置数据
intent.setData(Uri.parse("M:" + 2017));
****************************************************/
intent.setDataAndType(Uri.parse("M:" + 2017), "aa/bb");
// 开启Activity
this.startActivity(intent);
}
2-2.隐式意图的定义
通过指定一组动作或者数据
三、显示意图
3-1.显示意图定义
通过指定具体的包名和类名
3-2.总结:
1. 开启自己应用的界面用显示意图
2. 开启其他应用(系统应用)的时候用隐式意图
3. 显示意图更加安全一些
四、案例
4-1.案例——人品计算器
数据的传递
1. 通过getIntent()获取
小技巧:传递的类型是什么类型,就用什么类型去取
public class ResultActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_result);
TextView tv_name = (TextView) findViewById(R.id.tv_name);
TextView tv_sex = (TextView) findViewById(R.id.tv_sex);
TextView tv_dec = (TextView) findViewById(R.id.tv_dec);
Intent intent = getIntent();
// 小技巧:传递的类型是什么类型,就用什么类型去取
String name = intent.getStringExtra("name");
int sex = intent.getIntExtra("sex",0);
byte[] bytes = null;
tv_name.setText("Name: " + name);
try {
switch(sex){
case 0:
tv_sex.setText("sex: 男");
bytes = name.getBytes("gbk");
break;
case 1:
tv_sex.setText("sex: 女");
bytes = name.getBytes("utf-8");
break;
case 2:
tv_sex.setText("sex: ...");
bytes = name.getBytes("iso-8859-1");
break;
default:
Toast.makeText(getApplicationContext(), "未知错误", 1).show();
break;
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 计算人品的结果
int total = 0;
for (byte b : bytes) { //0001 0010
int num = b & 0xFF;
total += num;
}
int score = Math.abs(total) % 100;
if(score > 90){
tv_dec.setText("你的人品太好了!");
}else if(score > 80){
tv_dec.setText("你的人品还行了!");
}else if(score > 60){
tv_dec.setText("你的人品及格了!");
}else{
tv_dec.setText("你的人品不及格!");
}
}
}
4-2.案例——短信大全
public class MainActivity extends Activity {
String mess[] = {"今天的风儿轻柔无比,今天的花儿香飘万里;今天的鸟儿十分欢喜,今天的云儿满载笑意;今天的事儿万分顺利,今天的人儿如此甜蜜。所有美...",
"丫头,生活是你自己的,你哭它就对你哭,你笑它就对你笑。转眼,又是一年,你的生日即将来到。今年,还是少不了我对你的祝福,我忍不住...",
"世界上最动听的声音,是妈妈声声的呼唤;世界上最温暖的笑容,是妈妈温暖的笑脸。妈妈,原谅生日时我不能陪在您身边,在这个日子里,我..."};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv = (ListView) findViewById(R.id.lv);
// 设置数据,先有数据
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.item,mess);
// 设置数据适配器
lv.setAdapter(adapter);
// 给ListView设置监听事件
lv.setOnItemClickListener(new OnItemClickListener() {
// 当listView的一个条目被点击时调用
// Callback method to be invoked when an item in this AdapterView has been clicked.
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// 把点击条目的数据取出来
String content = mess[position];
// 跳转到短信页面
/*<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
* */
Intent intent = new Intent();
intent.setAction("android.intent.action.SEND");
intent.addCategory("android.intent.category.DEFAULT");
intent.setType("text/plain");
// 传递数据
intent.putExtra("sms_body", content);
startActivity(intent);
}
});
}
}
4-3.案例总结:
共同点:A界面-->B界面,然后把A界面的数据传输到B界面
A界面-->B界面,当B页面关闭的时候,把数据返回给界面
4-4.案例——短信
- 布局:
EditText中的内容对于自身的位置设置用android:gravity="",如android:gravity="top"
- 小细节:如果要开启的Activity需要返回数据,并且当开启的activity关闭的时候,想要得到开启的Activity的数据的时候,用startActivityForResult()开启
- 请求码和结果码的作用:指明数据的来源
五、Activity的生命周期
[1]onCreate()
[2]onDestroy() 当Activity销毁时调用
[3]onStart() 当Activity变成可视的时候调用
[4]onStop() 当Activity不可见的时候调用
[5]onResume() 当Activity开始交互的时候调用点击页面按钮 获取焦点
[6]onPause() 当Activity上的按钮不可以被点击 失去焦点
[7]onRestart() 当Activity被重新启动的时候调用
六、横竖屏切换Activity的生命周期
6-1.设置横竖屏
在清单文件中配置avtivity下的android:screenOrientation=""属性
- portrait竖屏
- landscape横屏
七、任务栈的概念
task,什么叫任务?
- 打开一个Activity叫进栈,关闭一个Activity叫出栈
- 我们操作的Acitivity永远是栈顶的那一个
- 任务栈是用来维护用户体验的
- 应用程序退出了,是任务栈清空了
- 一般情况下一个应用对应一个任务栈
八、Activity的四种启动模式
在清单文件中配置avtivity下的android:launchMode=""属性
- stander
- singletop
检查任务栈的栈顶
- singetask
检查任务栈
- singleInstance
系统会会为这个avtivity单独的创建任务栈,并且仅一个实例存在,与当前应用的其他avtivity无关
九、总结
- 如何创建一个新的Actiity
- 显示意图,隐式意图 ★
- 界面之间传递数据 ☆ putExtra() 用map封装的
- 开启Activity的两种方式
- 请求码和结果码
- 关闭一个Activity用finnis()
- Activity的生命周期
- 横竖屏进行切换
- task ☆
- Activity的四种启动模式 ☆