1. Activity的启动和结束
从当前页面跳转到新页面,跳转代码如下:
- startActivity(new Intent(源页面.this,目标页面.class));
从当前页面返回到上一个页面,相当于关闭当前页面,返回代码如下:
- finish();
代码示例
页面1
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/iv_back"
android:layout_width="40dp"
android:layout_height="40dp"
android:padding="5dp"
android:src="@drawable/back"/>
<Button
android:id="@+id/btn_finish"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="完成"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="按返回图标或者完成建均可返回"/>
</LinearLayout>
页面2
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<Button
android:id="@+id/btn_act_next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳转到下一个页面" />
</LinearLayout>
java代码
页面1
public class ActFinishActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_act_finish);
findViewById(R.id.btn_finish).setOnClickListener(this);
findViewById(R.id.iv_back).setOnClickListener(this);
}
@Override
public void onClick(View view) {
if(view.getId()==R.id.iv_back||view.getId()==R.id.btn_finish){
finish();
}
}
}
页面2
public class ActStartActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_act_start);
findViewById(R.id.btn_act_next).setOnClickListener(this);
}
@Override
public void onClick(View v) {
startActivity(new Intent(this, ActFinishActivity.class));
}
}
结果显示
页面1
页面2
2. Activity的生命周期
状态切换
3. Activity的启动模式
默认启动模式 standard
在该模式下,启动Activity会依照启动顺序被依次压入Task栈中
栈顶复用模式 singTop 该模式下,如果栈顶Activity为我们要新建的Activity,那么就不会重复创建新的Activity
栈内复用模式singleTask
该模式下如果task栈内存在目标Activity实例,则将task内对应Activity实例之上所有的Activity弹出栈,并将对应的Activity置于栈顶,获得焦点。
全局唯一模式singleInstance
在该模式下,为目标Activity创建一个新的Task栈,将目标Activity放入新的Task,并让目标Activity获得焦点。新的Task有且只有这一个Activity实例。
代码示例
public class JumpSecondActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_jump_second);
findViewById(R.id.btn_jump_first).setOnClickListener(this);
}
@Override
public void onClick(View view) {
Intent intent=new Intent(this,JumpFirstActivity.class);
//栈中存在待跳转的活动实例时,则重新创建该活动的实例并清除原实例上方的所有实例
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
}
public class JumpFirstActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_jump_first);
findViewById(R.id.btn_jump_second).setOnClickListener(this);
}
@Override
public void onClick(View v) {
Intent intent=new Intent(this,JumpSecondActivity.class);
//栈中存在待跳转的活动实例时,则重新创建该活动的实例并清除原实例上方的所有实例
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
}
public class LoginInputActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login_input);
findViewById(R.id.btn_jump_success).setOnClickListener(this);
}
@Override
public void onClick(View view) {
Intent intent=new Intent(this,LoginSuccessActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
其他启动标志
4. 显式intent 和隐式intent
Intent是各个组件沟通的桥梁,用户Android各组件之间的通信,主要完成以下工作
- 标明本次通信请求从哪里来、到哪里去、要怎么走。
- 发起方携带本次通信需要的数据内容,接收方从收到的意图中解析数据。
- 发起方若想判断接收方的处理结果,意图就要负责让接收方传回应答的数据内容
intent组成部分
4.1 显示意图
直接指定来源活动与目标活动,属于精准匹配。
配置方式
- 在Intent的构造函数指定
- 调用意图对象的setClass方法指定。
- 调用意图对象的setComponent方法指定
4.2 隐式Intent,没有明确指定要跳转的目标活动,只给出一个动作字符串让系统自动匹配,属于模糊匹配。
代码示例
public class ActionUnActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_action_un);
findViewById(R.id.btn_dial).setOnClickListener(this);
findViewById(R.id.btn_sms).setOnClickListener(this);
findViewById(R.id.btn_my).setOnClickListener(this);
}
@Override
public void onClick(View view) {
String phoneNo = "12345";
Intent intent= new Intent();
if(view.getId() == R.id.btn_dial){
intent.setAction(Intent.ACTION_DIAL);
Uri uri = Uri.parse("tel:"+phoneNo);
intent.setData(uri);
startActivity(intent);
}else if(view.getId() == R.id.btn_sms){
intent.setAction(Intent.ACTION_SENDTO);
Uri uri2 = Uri.parse("smsto:" + phoneNo);
intent.setData(uri2);
startActivity(intent);
}
}
}
5 Activity发送数据
5.1 向下一个Activity发送数据
- Intent使用Bundle对象存放待传递的数据信息。
- Bundle对象操作各类型数据的读写方法见下表。
代码示例
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv_send"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="1122"/>
<Button
android:id="@+id/btn_send"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="发送以上文本"/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv_recive"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
public class ActSendActivity extends AppCompatActivity implements View.OnClickListener {
private TextView tv_send;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_act_send);
tv_send= findViewById(R.id.tv_send);
findViewById(R.id.btn_send).setOnClickListener(this);
}
@Override
public void onClick(View view) {
Intent intent=new Intent(this,ActReceiveActivity.class);
Bundle bundle=new Bundle();
bundle.putString("request_time", DateUtil.getNowTime());
bundle.putString("request_content", tv_send.getText().toString());
intent.putExtras(bundle);
startActivity(intent);
}
}
public class ActReceiveActivity extends AppCompatActivity {
private TextView tv_recice;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_act_recive);
tv_recice= findViewById(R.id.tv_recive);
Bundle bundle = getIntent().getExtras();
String desc = String.format("请求时间:%s\n请求内容:%s", bundle.get("request_time"), bundle.get("request_content"));
tv_recice.setText(desc);
}
}
结果显示
5.2 向上一个Activity发送数据
详细步骤
- 上一个页面打包好请求数据,调用startActivityForResult方法执行跳转动作
- 下一个页面接收并解析数据,进行相应处理
- 下一个页面在返回上一个页面时,打包应答数据并调用setResult方法返回数据包裹
- 上一个页面重写方法onActivityResult,解析获得下一个页面的返回数据
代码示例
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv_request"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_request"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="传送请求数据"/>
<TextView
android:id="@+id/tv_response"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv_request"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_response"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="返回应答数据"/>
<TextView
android:id="@+id/tv_response"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
public class ActRequestActivity extends AppCompatActivity implements View.OnClickListener {
private TextView tv_request;
private final String mRequest="在?";
private ActivityResultLauncher<Intent> register;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_act_request);
tv_request= findViewById(R.id.tv_request);
TextView tv_response = findViewById(R.id.tv_response);
tv_request.setText("待发送的消息为:"+mRequest);
findViewById(R.id.btn_request).setOnClickListener(this);
register = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if(result!=null){
Intent intent = result.getData();
if(intent!=null &&result.getResultCode()== Activity.RESULT_OK){
Bundle bundle = intent.getExtras();
String requestTime = bundle.getString("response_time");
String requestContent = bundle.getString("response_content");
tv_response.setText("请求时间为:"+requestTime+"请求内容为:"+requestContent);
}
}
}
});
}
@Override
public void onClick(View view) {
Intent intent=new Intent(this,ActResponseActivity.class);
Bundle bundle=new Bundle();
bundle.putString("request_time", DateUtil.getNowTime());
bundle.putString("request_content",mRequest);
intent.putExtras(bundle);
register.launch(intent);
}
}
public class ActResponseActivity extends AppCompatActivity implements View.OnClickListener {
private static final String mResponse ="在";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_act_response2);
TextView tv_request = findViewById(R.id.tv_request);
Bundle bundle= getIntent().getExtras();
String desc = String.format("请求时间:%s\n请求内容:%s", bundle.get("request_time"), bundle.get("request_content"));
tv_request.setText(desc);
findViewById(R.id.btn_response).setOnClickListener(this);
TextView tv_response = findViewById(R.id.tv_response);
tv_response.setText("待返回的消息"+mResponse);
}
@Override
public void onClick(View view) {
Intent intent=new Intent();
Bundle bundle=new Bundle();
bundle.putString("response_time", DateUtil.getNowTime());
bundle.putString("response_content", mResponse);
intent.putExtras(bundle);
setResult( Activity.RESULT_OK, intent);
finish();
}
}
结果显示