目录
Activity的生命周期
生命周期方法
方法名称 | 方法作用 |
onCreate | 表示Activity已经被创建,一般在这个方法中做一些初始化的工作,比如调用setContentView去加载布局资源或者初始化Activity所需的数据。 |
onStart | 表示Activty已经被启动,已经可见,但是此时还处于后台,不能与用户进行交互。 |
onResume | 表示Activty已经被启动,已经可见,但是此时还处于后台,不能与用户进行交互 |
onPause | 当前Activity被其他活动的Activity覆盖时或锁屏时调用 |
onStop | 在Activity对用户不可见时调用 |
onDestory | 在Activity被销毁时调用;注意:在使用手机时会根据不同情况进行横竖屏切换。当手机横竖屏切换时,会根据清单文件AndroidManifest.xml文件中的configChanges属性不同而调用不同的生命周期
在使用默认属性时,调用的方法顺序依次时:onCreate,onStart,onResume
当进行横竖屏切换时,调用的方法依次时:onPause,onStop,onDestory,onCreate,onStart,onResume |
onRestart | 当从新启动的Activity返回原来的Activity时,原来的Activity会调用此方法。表示Activity正在重新启动。 |
Activity的启动模式
众所周知当我们多次启动同一个Activity时,系统会创建多个实例,并把它们按照先进后出的原则一一放入任务栈中,当我们按back键时,就会有一个activity从任务栈顶移除,重复下去,直到任务栈为空,系统就会回收这个任务栈。但是这样以来,系统多次启动同一个Activity时就会重复创建多个实例,这种做法显然不合理,为了能够优化这个问题,Android提供四种启动模式来修改系统这一默认行为。
启动模式 | 作用 | 设置 |
standard | 这个模式是默认的启动模式,即标准模式,在不指定启动模式的前提下,系统默认使用该模式启动Activity,每次启动一个Activity都会重写创建一个新的实例,不管这个实例存不存在,这种模式下,谁启动了该模式的Activity,该Activity就属于启动它的Activity的任务栈中。这个Activity它的onCreate(),onStart(),onResume()方法都会被调用。 |
|
singleTop | 这个模式下,如果新的activity已经位于栈顶,那么这个Activity不会被重写创建,同时它的onNewIntent方法会被调用,通过此方法的参数我们可以去除当前请求的信息。如果栈顶不存在该Activity的实例,则情况与standard模式相同。需要注意的是这个Activity它的onCreate(),onStart()方法不会被调用,因为它并没有发生改变。 |
|
singleTask | 这个模式十分复杂,有各式各样的组合。在这个模式下,如果栈中存在这个Activity的实例就会复用这个Activity,不管它是否位于栈顶,复用时,会将它上面的Activity全部出栈,并且会回调该实例的onNewIntent方法。其实这个过程还存在一个任务栈的匹配,因为这个模式启动时,会在自己需要的任务栈中寻找实例,这个任务栈就是通过taskAffinity属性指定。如果这个任务栈不存在,则会创建这个任务栈。 |
|
singleInstance | 该模式具备singleTask模式的所有特性外,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。 |
|
Activity之间的跳转与传值
Intent(Activity之间的跳转)
在Android系统中,每个应用程序通常都是由许多个界面组成,每个界面就是一个Activity,在这些界面进行跳转时,实际上也就是Activity之间的跳转,Activity之间的跳转需要使用到Intent组件
显式跳转
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建intent对象,参数1是当前activity的引用,参数2是要跳转的activity的类型
Intent intent=new Intent(this,OtherActivity.class);
// 跳转
this.startActivity(intent);
}
}
隐式跳转
隐式意图相比显式意图来说更为抽象,它并没有明确指定要开启那个控件,而是通过action和category等属性信息,系统根据这些信息来进行分析,然后寻找目标
一般我么可以通过设置Intent组件的action属性,来打开android内置的一些软件,例如:相机,浏览器,等等
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent=new Intent();
// 设置action动作,该动作要和清单文件中设置的一样
intent.setAction("android.intent.action.MAIN");
this.startActivity(intent);
}
}
Activity之间的传值
通过Intent组件附带参数实现传值
// 创建Intent对象
Intent intent=new Intent(occurpy,CaculateActivity.class);
// 携带数据
intent.putExtra("data","content");
// 跳转
startActivity(intent);
Intent对象提供了很多重载的方法供我们使用
获取跳转页面附带的参数
// 获取intent信息
Intent intent=getIntent();
// 里面附带的参数
String data = intent.getStringExtra("data_name");
Activity之间的数据回传
在Activity中,使用Intent 既可以将数据传给下一个Activity,还可以将数据回传给上一个Activity。通过查阅API文档可以发现,Activity中提供了一个startActivityForResult(Intent intent,int requestCode)方法,该方法也用于启动Activity,并且这个方法可以在当前Activity 销毁时返回一个结果给上一个 Activity。这种功能在实际开发中很常见,例如发微信朋友圈时,进入图库选择好照片后,会返回到发表状态页面并带回所选的图片信息。
startActivityForResult(Intent intent,int requestCode)方法接收两个参数,第1个参数是Intent对象,第2个参数是请求码,用于判断数据的来源,输入一个唯一值即可。
在Activity01里面跳转至Activity02
// 创建Intent信息
Intent intent=new Intent(occurpy,CaculateActivity.class);
// 使用activtiy的startActivityForResult方法跳转,第二参数是请求码,第二方数据回传时我们通过requestCode来判断是哪个页面
startActivityForResult(intent,100);
接下来在Activity中添加返回数据的示例代码:
// 创建一个Intent对象,附加返回数据
Intent intent=new Intent();
intent.putExtra("extra_data","hello activity");
// 返回数据,第一个参数是响应码,一般是"0 或者 1",参数2是把带有参数的Intent传递进去
setResult(1,intent);
// 只有在被调用的activity被销毁的时候,才会触发本来的activity的方法,所以我们需要手动调用一finish
finish();
在Activity01中重写onActivityResult方法来得到返回数据,因为在Activtiy02被销毁时会回调Activity01的onActivityResult方法
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 通过判断请求码以判断是从哪个activity传递回来
// 因为通常我们会调用很多不同的页面,而被调用的页面最终传递数据都会回调当前方法
if(requestCode==100){
if(resultCode==1){
String result=data.getStringExtra("result");
edit02.setText(result);
}
}
}
activity调用传值实例
1.我们使用Intent进行传值,传输数据给第二个页面,第二个页面计算完再返回第一个页面
2.调用系统相机拍照,显式在当前页面
效果
界面
源码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="输入一些数字,用空格隔开"
android:layout_marginTop="60dp"
android:id="@+id/edit01"></EditText>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_below="@+id/edit01"
android:id="@+id/line01"
android:gravity="center_horizontal">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击求取平均值"
android:id="@+id/btn01"></Button>
</LinearLayout>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="计算的结果将显式在这里"
android:layout_marginTop="60dp"
android:id="@+id/edit02"
android:layout_below="@+id/line01"></EditText>
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
android:id="@+id/img01"
android:layout_below="@+id/edit02"
android:src="@color/colorPrimary"
android:layout_centerHorizontal="true"></ImageView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_below="@+id/img01"
android:id="@+id/line02"
android:gravity="center_horizontal">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击拍照"
android:layout_marginTop="20dp"
android:id="@+id/btn02"></Button>
</LinearLayout>
</RelativeLayout>
MainActivity
public class MainActivity extends AppCompatActivity {
// 声明
private AppCompatActivity occurpy;
private Button btn_caculate;
private Button btn_camera;
private EditText edit01;
private EditText edit02;
private ImageView img;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 绑定
occurpy=this;
btn_caculate=this.findViewById(R.id.btn01);
btn_camera=this.findViewById(R.id.btn02);
edit01=this.findViewById(R.id.edit01);
edit02=this.findViewById(R.id.edit02);
img=this.findViewById(R.id.img01);
btn_caculate.setOnClickListener(new View.OnClickListener() {
// 请求跳转其他界面进行运算
@Override
public void onClick(View v) {
Intent intent=new Intent(occurpy,CaculateActivity.class);
Log.i("cn.liuhao.application",edit01.getText().toString());
intent.putExtra("data",edit01.getText().toString());
occurpy.startActivityForResult(intent,200);
}
});
btn_camera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
occurpy.startActivityForResult(intent,300);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 在其他activity回显数据时,会使用到onActivityResult
if(requestCode==200){
if(resultCode==200){
String result=data.getStringExtra("result");
edit02.setText(result);
}
}
if(requestCode==300){
Bundle extras=data.getExtras();
Bitmap photo=extras.getParcelable("data");
img.setImageBitmap(photo);
try {
FileOutputStream out=openFileOutput("a.jpeg", Activity.MODE_PRIVATE);
photo.compress(Bitmap.CompressFormat.JPEG,75,out);
out.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
caculateActivity
public class CaculateActivity extends AppCompatActivity {
private TextView txt01;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_caculate);
// 接受数据
Intent intent=getIntent();
String data = intent.getStringExtra("data");
Log.i("cn.liuhao.application",data);
txt01=this.findViewById(R.id.txt01);
// 分隔字符串
String[] split = data.split("\\s+");
double sum=0;
for(String item : split)
{
txt01.setText(txt01.getText()+"+"+item);
// 计算
sum+=Double.parseDouble(item);
}
Intent re=new Intent();
re.putExtra("result",String.valueOf(sum));
this.setResult(200,re);
this.finish();
}
}