一、Activity介绍
1、先介绍一下什么是组件
(1)组件的对象是由系统创建,而且一般都是继承特定接口或父类。
(2)组件需要在配置文件配置全类名。
(3)组件的对象具有一定的生命周期, 它的类中有对应的生命周期回调方法
2、Activity是什么?
Activity提供界面和用户交互,当然,和系统相关的打电话,短信,拍照等也要用到Activity。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
二、、Intent
Intent经常和Activity配合使用,Activity的startActivity(Intent intent)。
1、Intent分为显示Intent与隐式Intent:
(1)显示Intent
显示Intent可以实现在不同的Activity之间进行跳转,指明了从哪个Activity跳转到哪里Activity。而且跳转的时候还可以带上一些额外的数据,到达另一个Activity可以把额外的数据获取。
例1:从MainActivity跳转到HomeActivity
public class MainActivity extends Activity {
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获得按钮对象
btn=findViewById(R.id.but_1);
//给按钮注册点击事件
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//创建Intent对象
Intent intent=new Intent(MainActivity.this,HomeActivity.class);
//额外数据
intent.putExtra("id",1);
//启动指定的HomeActivity
startActivity(intent);
}
});
}
}
public class HomeActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
Intent intent=getIntent();
//获取MainActivity设置的额外数据
int id=intent.getIntExtra("id",0);
Toast.makeText(this,id+"",Toast.LENGTH_LONG).show();
}
}
例2:从MainActivity跳转到HomeActivity,把HomeActivity的数据带回到MainActivity。
public class MainActivity extends Activity {
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获得按钮对象
btn=findViewById(R.id.but_1);
//给按钮注册点击事件
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//创建Intent对象
Intent intent=new Intent(MainActivity.this,HomeActivity.class);
//注意这里不一样拉
startActivityForResult(intent,1);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case 1:
if(resultCode==RESULT_OK){
String name=data.getStringExtra("name");
Toast.makeText(this,name+"",Toast.LENGTH_LONG).show();
}
break;
}
}
}
public class HomeActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
Intent intent=getIntent();
//获取MainActivity设置的额外数据
intent.putExtra("name","haitao");
setResult(RESULT_OK,intent);
finish();//关闭当前的Activity
}
}
2、隐式Intent
隐式Intent就是不直接告诉要启动哪个活动,而是制定了配置来决定。
说白了就是一个活动根据Intent设置的action和category的值,系统到功能清单文件中去找匹配的action和category的值,有匹配的就启动找到的活动。
例1:隐式方式启动HomeActivity
只有同时满足HomeActivity的action和category才能启动HomeActivity。
<activity android:name=".HomeActivity">
<intent-filter>
<action android:name="com.haitao.xxxx.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="com.haitao.xxxx.categort.LALALALA"/>
</intent-filter>
</activity>
public class MainActivity extends Activity {
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获得按钮对象
btn=findViewById(R.id.but_1);
//给按钮注册点击事件
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//创建Intent对象(隐式)
Intent intent=new Intent("com.haitao.xxxx.ACTION_START");
//这个可以不用加上,系统会自动添加,因为使用的是系统默认的。
intent.addCategory("android.intent.category.DEFAULT");
//如果功能清单中使用的不是系统默认,那么就要加上
intent.addCategory("com.haitao.xxxx.categort.LALALALA");
//也可以带上数据
intent.putExtra("name","haitao");
//启动指定的Activity
startActivity(intent);
}
});
}
}
public class HomeActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
Intent intent=getIntent();
String name=intent.getStringExtra("name");
Toast.makeText(this,name+"",Toast.LENGTH_LONG).show();
}
}
例2:隐式启动浏览器
//创建Intent对象(隐式)
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
例3:隐式启动打电话的活动
Intent intent=new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
三、活动的生命周期
1、返回栈
Android中的活动是可以重叠的,新启动的活动会覆盖到原来活动的上面,销毁上一个活动下一个活动就会显示出来。
2、活动的生命周期
活动的生存周期:
onCreate() :活动第一次创建时候会调用。
onStart(): 活动从不可见到可见时候会调用。
onResume(): 活动准备好了和用户交互时候调用,活动会处于运行状态并且处于栈顶位置。
onPause(): 系统准备启动或恢复一个另一个活动时候调用,这里可以用来把消耗CPU的资源释放了,保存有用的数据。
onStop():完全不能看到的活动会处于停止状态。
onDestory():准备销毁一个活动的时候会调用。
onRestart():活动从停止到运行状态会调用,就是重启一个活动。
活动的四种状态
(1)运行状态:活动处于栈顶的时候
(2)暂停状态:活动不在栈顶但是可见(弹出提示框,对话框下面的活动就会暂停)。
(3)停止状态:活动不在栈顶并且完全不可见,活动就会停止。
(4)销毁状态:活动被移除了。
结论
1)界面从“死亡”-->“运行"
创建对象-->onCreate()-->onStart()-->onResume()---可见可操作(运行状态)
2) 界面从“运行”-->“死亡"
onPause()-->onStop()-->onDestroy()-->Activity对象成为垃圾对象---不可见也不存在死亡状态)
3) 界面从“运行”-->“停止"
onPause()-->onStop()---不可见但存在
4) 界面从“停止” -->“运行"
onRestart()-->onStart()-->onResume()
5) 界面从“运行”-->“暂停"
onPause()
6) 界面从“暂停” -->“运行"
onResume()
3、解决活动被回收后数据没有了的情况
例如:进入了一个填写表但的活动,然后点了表单的某个按钮到达了另一个活动,当从另一个活动返回来发现原来填写的表但数据没有了,这时表单的活动就是被系统回收了。
public class MainActivity extends Activity {
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//当活动再次创建时候读取数据
if(savedInstanceState!=null){
savedInstanceState.getString("name");
}
}
//当活动被回收之前会被调用,可以用来保存临时数据
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//保存数据,假设是从表单获取的数据
String name="haitao";
outState.putString("name",name);
}
}
四、Activity的launchMode
1、Activity的launchMode
(1、在Android中, 启动一个Activity有时需要总是创建一个新对象, 有时需要复用已有的对象, 可以通过在配置activity时通过launchMode属性指定
(2 launchMode属性值(4个)为:
standard: 标准模式,每次调用startActivity()方法就会产生一个新的实例。
singleTop: 如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例;如果不位于栈顶,会产生一个新的实例。
singleTask: 只有一个实例, 默认在当前Task中
singleInstance: 只有一个实例, 创建时会新建一个栈, 且此栈中不能有其它对象