一.Activity的生命周期
其中,onCreate(),onStart(),onResume()均为可显示状态;
onPause(),onStop()均为隐藏状态。
界面跳转:当从a界面进入到b Activity时,a Activity首先进入onPause()——b Activity依次为onCreate()——onStart()——onResume()——最后a Activity进入onStop()状态,转为后台运行。此时按返回键再返回a Activity时,b Activity:onPause()——a Activity:onRestart()——onStart()——onResume()——最后b Activity:onStop()——onDestroy()
二.启动Activity
1.
新建名为Activity的Project。
java文件(First_Activity.java(主Activity),Second_Activity.java)
xml文件(activity_first.xml,activity_second.xml)
2.activity_first.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".FirstActivity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/button_name1"
android:id="@+id/button1"/>
</android.support.constraint.ConstraintLayout>
3.activity_second.xml
什么都不加
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="32dp"
android:gravity="center_vertical"
android:text="@string/text1" />
</LinearLayout>
4.1First_Activity.java
(注:此处用的是匿名内部类button监听方式)
package com.example.administrator.activity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class FirstActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
Button button1=findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
}
5.Second_Activity.java
package com.example.administrator.activity;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class SecondActivity extends Activity {
private String TAG="tag";
@Override
protected void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//把页面布局和该窗口绑定
setContentView(R.layout.activity_second);
//打印到日志中,第一个参数是键key,第二个参数是值value
Log.d(TAG," SecondActivity,onCreate");}
}
6.AndroidManifest.xml
注意:每新建一个Activity,都必须在这个文件里注册该Activity的信息,否则系统进不去这个Activity,会崩掉。
因此此处添加<activity android:name=".SecondActivity"/>
一定要添加在<application>
<</application>
里面
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.administrator.activity">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity"/>
</application>
</manifest>
7.真机执行
然后即可执行查看效果
4.2启动Activity的另一方式
修改First_Activity.java文件如下
package com.example.administrator.activity;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class FirstActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
Button button1=findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//从此处开始修改
Intent intent=new Intent();
ComponentName component=new ComponentName(FirstActivity.this,SecondActivity.class);
intent.setComponent(component);
startActivity(intent);
}
});
}
}
官方文档解释https://developer.android.google.cn/reference/android/content/ComponentName
ComponentName(Context pkg, Class<?> cls)
Create a new component identifier from a Context and Class object.
再次执行也可实现启动另一Activity的功能。
三.启动 Activity 以获得结果
1.
新建java文件Three_Activity.java ;xml文件:activity_three.xml
2.activity_three.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/text2"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/button_name3"
android:id="@+id/button3"/>
</LinearLayout>
3.
在activity_first.xml中添加TextView以显示回传的数据
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv"
android:hint="@string/hint"/>
4.Three_Activity.java
package com.example.administrator.activity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class ThreeActivity extends Activity {
private String content="这是回传的数据";
private int resultcode=2;//不同的Activity回传就设置不同的resultcode
@Override
protected void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_three);
Button button3=findViewById(R.id.button3);
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
//封装要回传的数据
intent.putExtra("data",content);
//回传的数据实际上回传的是一个携带数据的信使(Intent)
setResult(resultcode,intent);
finish();
}
});
}
}
5.修改First_Activity.java
修改后的代码为
package com.example.administrator.activity;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class FirstActivity extends Activity {
//新增:requestcode值
private int REQ=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
Button button1=findViewById(R.id.button1);
//新增:初始化button2
Button button2=findViewById(R.id.button2);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
ComponentName component=new ComponentName(FirstActivity.this,SecondActivity.class);
intent.setComponent(component);
startActivity(intent);
}
});
//新增:增加button2监听事件
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(FirstActivity.this,ThreeActivity.class);
startActivityForResult(intent,REQ);
}
});
}
//新增:页面回调数据函数
//该页面通过 resultCode判断是由哪个页面回传的数据
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
TextView textview=findViewById(R.id.tv);
if(resultCode==2&&requestCode==REQ){
String stringdata=data.getStringExtra("data");
textview.setText(stringdata);}
}
}
其中,尤其要注意初始化textview时 TextView textview=findViewById(R.id.tv);
的放置位置,我原本放在onCreat方法里和button2.setOnClickListener方法里都显示textview never used 导致点击“回调数据”按钮时闪退。
6.
最后在AndroidManifest.xml中添加
<activity android:name=".ThreeActivity"/>
不过此操作建议在新建Three_Activity.java 时就做,以免忘记。
7.真机执行效果图
另附strings.xml文件
<resources>
<string name="app_name">Activity</string>
<string name="button_name1">启动Activity</string>
<string name="button_name2">启动Activity以获得结果</string>
<string name="button_name3">回传数据</string>
<string name="text1">hello,this is secondactivity</string>
<string name="text2">hello,this is threeactivity</string>
<string name="hint">回传的数据将显示在这里</string>
</resources>
四.查看Activity任务栈
1.
关于任务和任务栈的概念,请自行阅览http://android.xsoftlab.net/guide/components/tasks-and-back-stack.html
技巧:打开cmd,输入adb shell dumpsys activity,即可查看任务栈。
2.四种launch modes
(1)”standard” (the default mode)
比如:任务栈为 A-B-C-D; D 在栈顶。intent要打开什么就打开什么。若intent带来打开B的意图,则为 A-B-C-D-B;若intent带来打开D的意图,则为 A-B-C-D-D;
(2)”singleTop”
比如:任务栈为 A-B-C-D; D 在栈顶。则会不重复打开栈顶的实例。若intent带来打开B的意图,则为 A-B-C-D-B;若intent带来打开D的意图,还是 A-B-C-D;
这个可以用来用来多次创建,比如点击一个按钮启动一个activity,如果快速点击多次会导致反复启动,一种办法是在点击事件里过滤,另一个办法就是设置目标activity是singletop。
(3)”singleTask”
此图来自官网图片,无法理解,不说了……大家自行读文档(网址上面也有),有什么好的理解方式也可以帮帮我……
(4)”singleInstance”
一个task里只有一种Activity的一种或多种实例。比如有这样两个activity——firstactivity和secondactivity,并且firstactivity内有按钮可以跳转到secondactivity,同样secondactivity内也有按钮可以跳转到firstactivity,先启动firstactivity(称为firstactivity1,在taskA中),点击firstactivity1内的按钮,跳出secondactivity(称为secondactivity2,在taskB中),但是因为”singleInstance”的性质因此会生成不同的taskid在不同的栈中;点击secondactivity1内的按钮,再跳出一个firstactivity(称为firstactivity2,又回到了taskA中)……以此类推,一个栈只能有一种Activity的多种实例,就像下面这样子
taskA(firstactivity1-firstactivity2-firstactivity3-……)
taskB(secondactivity1-secondactivity2-secondactivity3……)
注:每一个实例的代码都会附上相应的代码片或者图片,保证代码完整展示在博客中。
附:&Android开发思维导图一张思维导图,告诉你Android新手如何快速入门 - CSDN博客 https://blog.csdn.net/vanpersie_9987/article/details/52518782
&官方文档https://developer.android.google.cn/guide/components/activities
&Button监听事件的几种设置方法https://www.cnblogs.com/xiao-chuan/p/6074075.html
&学习视频教程地址
1. Android攻城狮的第一门课(入门篇)——第17章 认识“老朋友”Activity&第18章 使用Intent实现页面跳转https://www.imooc.com/learn/96
2.Android-重识Activityhttps://www.imooc.com/learn/384
3.Android-深入Activityhttps://www.imooc.com/learn/388
4..Android-精通Activityhttps://www.imooc.com/learn/413