其中,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的Project。
java文件(First_Activity.java(主Activity),Second_Activity.java)
xml文件(activity_first.xml,activity_second.xml)
<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>
什么都不加
<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>
(注:此处用的是匿名内部类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);
}
});
}
}
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");}
}
注意:每新建一个Activity,都必须在这个文件里注册该Activity的信息,否则系统进不去这个Activity,会崩掉。
因此此处添加
一定要添加在
<里面
<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>
然后即可执行查看效果
修改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的功能。
新建java文件Three_Activity.java ;xml文件:activity_three.xml
<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>
在activity_first.xml中添加TextView以显示回传的数据
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv"
android:hint="@string/hint"/>
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();
}
});
}
}
修改后的代码为
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 导致点击“回调数据”按钮时闪退。
最后在AndroidManifest.xml中添加
<activity android:name=".ThreeActivity"/>
不过此操作建议在新建Three_Activity.java 时就做,以免忘记。
<string name="app_name">Activitystring>
<string name="button_name1">启动Activitystring>
<string name="button_name2">启动Activity以获得结果string>
<string name="button_name3">回传数据string>
<string name="text1">hello,this is secondactivitystring>
<string name="text2">hello,this is threeactivitystring>
<string name="hint">回传的数据将显示在这里string>
关于任务和任务栈的概念,请自行阅览http://android.xsoftlab.net/guide/components/tasks-and-back-stack.html
技巧:打开cmd,输入adb shell dumpsys activity,即可查看任务栈。
比如:任务栈为 A-B-C-D; D 在栈顶。intent要打开什么就打开什么。若intent带来打开B的意图,则为 A-B-C-D-B;若intent带来打开D的意图,则为 A-B-C-D-D;
比如:任务栈为 A-B-C-D; D 在栈顶。则会不重复打开栈顶的实例。若intent带来打开B的意图,则为 A-B-C-D-B;若intent带来打开D的意图,还是 A-B-C-D;
这个可以用来用来多次创建,比如点击一个按钮启动一个activity,如果快速点击多次会导致反复启动,一种办法是在点击事件里过滤,另一个办法就是设置目标activity是singletop。
此图来自官网图片,无法理解,不说了……大家自行读文档(网址上面也有),有什么好的理解方式也可以帮帮我……
一个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