Activity的创建与生命周期
-
Activity的创建:
包名处点击右键选择【new】->【Activity】->【Empty Activity】选项,填写Activity信息,完成创建。
MainActivity里改成(R.layout.Empty Activity的名字) -
生命周期状态:
启动状态:当Activity启动之后便会进入下一个状态
运行状态:Activity处于屏幕最前端,可与用户进行交互。
暂停状态:Activity任然可见,但无法获取焦点,用户对它操作没有相应
停止状态:Activity完全不可见,系统内存不足时会销毁该Activity -
生命周期方法:
onCreate():在Activity创建时调用,通常做一些初始化设置。
onStart():在Activity即将可见时调用。
onResume():在Activity获取焦点开始与用户交互时调用。
onPause():在当前Activity被其他Activity覆盖或锁屏时调用。
onStop():在Activity对用户不可见时调用。
onDestroy():在Activity销毁时调用。
onRestart():在Activity从停止状态再次启动时调用
- Activity的四种启动模式:
(1)standard模式:Standard模式是Android的默认启动模式,你不在配置文件中做任何设置,那么这个Activity就是standard模式,这种模式下,Activity可以有多个实例,每次启动Activity,无论任务栈中是否已经有这个Activity的实例,系统都会创建一个新的Activity实例
(2)singleTop模式:SingleTop模式和standard模式非常相似,主要区别就是当一个singleTop模式的Activity已经位于任务栈的栈顶,再去启动它时,不会再创建新的实例,如果不位于栈顶,就会创建新的实例。
(3)singleTask模式:SingleTask模式的Activity在同一个Task内只有一个实例,如果Activity已经位于栈顶,系统不会创建新的Activity实例,和singleTop模式一样。但Activity已经存在但不位于栈顶时,系统就会把该Activity移到栈顶,并把它上面的activity出栈。
(4)singleInstance模式:singleInstance模式也是单例的,但和singleTask不同,singleTask只是任务栈内单例,系统里是可以有多个singleTask Activity实例的,而singleInstance Activity在整个系统里只有一个实例,启动一singleInstanceActivity时,系统会创建一个新的任务栈,并且这个任务栈只有他一个Activity。
Intent的使用与数据传递
- Intent(意图)的使用
一般用于启动Activity、Service以及发送广播等。根据开启目标组件的方式不同,Intent被分为显示意图和隐式意图
显示意图查找Activity
//显示意图1
Intent intent = new Intent(this, Main2Activity.class);//通过指定一个具体的类名
startActivity(intent);//接收一个意图
//显示意图2
Intent intent =new Intent();
intent.setClass(MainActivity.this,Main2Activite.class);
隐式意图查找Activity
先通过app-manifests-AndroidManifest编写Main2Activity的时间
<activity android:name=".Main2Activity">
<intent-filter>
//action完成这个事件
<action android:name="com.ithema.main2" />
//完成这个事件所需要的前提条件
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
在在ActivityMain中编写相应的代码
Intent intent = new Intent();
intent.setAction("com.ithema.main2");
intent.addCategory("android.intent.category.DEFAULT");
startActivity(intent);
实战演练打开浏览器
先创建好背景图片还有一个button,在MainActivity里运用隐式意图编写代码
//1.找到按钮并设置点击事件
Button button=(Button) findViewById(R.id.main_button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//通过隐式意图开启系统浏览器
Intent intent = new Intent();
//设置开启浏览器的动作
intent.setAction("android.intent.action.VIEW");
//设置要打开的网页
intent.setData(Uri.parse("http://www.baidu.com"));
//开启页面
startActivity(intent);
}
运行结果如下:
数据传递
A页面跳转到B页面
//A页面代码
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(StateActivity.this,ShopActivity.class);
Bundle bundle=new Bundle();
bundle.putString("name","qiab");
bundle.putString("num","88");
intent.putExtras(bundle);
startActivity(intent);
}
//B页面代码
textView=findViewById(R.id.textView);
Bundle bundle=getIntent().getExtras();
String name=bundle.getString("name");
String num=bundle.getString("num");
textView.setText(name+","+num);
//A页面
buttonLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,StateActivity.class);
//传递数据,用户名和密码
intent.putExtra("userName",editTextName.getText().toString());
intent.putExtra("userPwd",editTextPwd.getText().toString());
startActivity(intent);
}
});
//B页面接收数据放在两个textView上
Intent intent=getIntent();//通过意图接收数据
//获取意图中字符串的值
textViewName.setText(intent.getStringExtra("userName"));
textViewPwd.setText(intent.getStringExtra("userPwd"));
数据回传
创建一个Weapon类,用来传递数据。
Weapon实现一个接口
public class Weapon implements Serializable
//每个Button页面的监听事件添加相应的数据
returnWeapon(sword);
returnWeapon(shield);
returnWeapon(weapon);
//C页面,方法return处理设置武器结果
private void returnWeapon(Weapon weapon)
{
Intent intent=new Intent();
intent.putExtra("weapon",weapon);
setResult(RESULT_OK,intent);
finish();
}
//第二个页面需要接受数据
//Generate-Override—OnActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Weapon weapon=(Weapon) data.getSerializableExtra("weapon");
progressBar1.setProgress(progressBar1.getProgress()+weapon.getAttack());
progressBar2.setProgress(progressBar2.getProgress()+weapon.getDefence());
progressBar3.setProgress(progressBar3.getProgress()+weapon.getSpeed());
}
//显示在小宠物的进度条上