Activity组件应用
一、Activity的生命周期与启动模式
五种状态
- 启动状态(OnCreate):当 Activity启动之后便会进入下一状态。
- 运行状态(OnStart):Activity处于屏幕最前端,可与用户进行交互
- 暂停状态(OnPause):Activity仍然可见,但无法获取焦点,用户对它操作没有响应
- 停止状态(OnStop):Activity完全不可见,系统内存不足时会销毁该Activity
- 销毁状态(OnDestroy):Activity将被清理出内存
栈是一种“先进后出”的数据结构。Android中,采用任务栈的形式来管理 Activity。
四种启动模式
- standard模式:是Activity的默认启动方式,每启动一个 Activity就会在栈顶创建一个新的实例。
- singleTop模式:判断要启动的 Activity实例是否位于栈顶,如果位于栈顶则直接复用,否则创建新的实例。
- singleTask模式:每次启动该 Activity时,系统首先会检查栈中是否存在当前 Activity实例,如果存在则直接使用,并把当前Activity之上的所有实例全部出栈。
- singlelnstance模式:启动一个新的任务栈来管理 Activity实例,无论从哪个任务栈中启动该 Activity,该实例在整个系统中只有一个。
二、Intent(意图)
Intent被称为意图,是程序中各组件进行交互的一种重要方式,它不仅可以指定当前组件要执行的动作,还可以在不同组件之间进行数据传递。
一般用于启动 Activity、Service以及发送广播等。根据开启目标组件的方式不同,Intent被分为两种类型显示意图和隐式意图。
- 显式意图可以直接通过名称开启指定的目标组件
Intent intent=new Intent(this,Activity02.class);
intent.putExtra("extra_data","Hello Activity02");//Intent提供的putExtra()方法进行数据传递
startActiviy(intent);
Intent intent=getIntent();
String data=intent.getStringExtra("extra_data");//接收数据
- 隐式意图通过指定 action和 category等属性,系统根据这些信息进行分析后寻找自标 Activity
Intent intent=new Intent();
intent.setAction("cn.iteast.START_ACTIVITY");
startActivity(intent);
<activity android:name="cn.iteast.Activity02">
<intent-filter>
<action android:name="cn.iteast.START_ACTIVITY"/>
<category android:name="android.intent.category.DEFALT"/>
</intent-filter>
</activity>
显式意图和隐式意图不同的地方就在于显式意图直接打开Activity的界面,这往往是单一的;而隐式意图是通过action等属性打开界面,如果有多个相同action的界面,就会显示多个,例如你想要打开一个文件,系统就会弹出用WPS打开、用记事本打开等等,这就是一种隐式意图吧。
数据回传
Intent intent=new Intent(this,Activity02.class);
startActivityForResult(intent,1);//这里不能使用startActivity
Intent intent=new Intent();
intent.putExtra("extra_data","Hello Activity01");
setResult(1,intent);//回传数据
protected void onActivityResult(int requestCode,int resultCode,Intent data){
super.onActivityResult(requestCode,resultCode,data);
if(requestCode==1){
if(resultCode==1){
String string=data.getStringExtra("extra_data");
}
}
}
小例子
一、菜单栏
1.实现效果
2.代码实现
第一种方法:在xml文件里写菜单栏
新建一个menu.xml文件在里面写入以下代码
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/main_menu_0"
android:icon="@drawable/pic0"
android:title=" 打印 "
app:showAsAction="withText"
/>
<item android:id="@+id/main_menu_1"
android:icon="@drawable/pic1"
android:title=" 新建 "
/>
<item android:id="@+id/main_menu_2"
android:icon="@drawable/pic2"
android:title=" 邮件 "
/>
<item android:id="@+id/main_menu_3"
android:icon="@drawable/pic3"
android:title=" 设置 "
/>
<item android:id="@+id/main_menu_4"
android:icon="@drawable/pic4"
android:title=" 订阅 "
/>
</menu>
在java主文件中写入以下代码
package com.example.androidapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.TextView;
public class Menuexample extends AppCompatActivity {
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater menuInflater=getMenuInflater();
menuInflater.inflate(R.menu.menu_ex,menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
TextView label = (TextView)findViewById(R.id.label);
switch (item.getItemId()) {
case R.id.main_menu_0:
label.setText(" 打印,菜单 ID:" + item.getItemId());
return true;
case R.id.main_menu_1:
label.setText(" 新建,菜单 ID:" + item.getItemId());
return true;
case R.id.main_menu_2:
label.setText(" 邮件,菜单 ID:" + item.getItemId());
return true;
case R.id.main_menu_3:
label.setText(" 设置,菜单 ID:" + item.getItemId());
return true;
case R.id.main_menu_4:
label.setText(" 订阅,菜单 ID:" + item.getItemId());
return true;
default:
return false;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menuexample);
}
}
除了连接layout布局的xml文件外,还要写一个函数连接菜单栏的xml文件,TextView文件写在layout布局的xml文件内。在switch语句中,每个case里的名字应该是菜单栏xml文件里给各个选项定义的名字。
第二个方法:逻辑代码动态生成菜单
在java主文件里写入以下代码
package com.example.androidapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.TextView;
public class Menuexample extends AppCompatActivity {
final static int MENU_00 = Menu.FIRST;
final static int MENU_01 = Menu.FIRST+1;
final static int MENU_02 = Menu.FIRST+2;
final static int MENU_03 = Menu.FIRST+3;
final static int MENU_04 = Menu.FIRST+4;
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0,MENU_00,0," 打印 ").setIcon(R.drawable.pic0);
menu.add(0,MENU_01,1," 新建 ").setIcon(R.drawable.pic1);
menu.add(0,MENU_02,2," 邮件 ").setIcon(R.drawable.pic2);
menu.add(0,MENU_03,3," 设置 ").setIcon(R.drawable.pic3);
menu.add(0,MENU_04,4," 订阅 ").setIcon(R.drawable.pic4);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
TextView label = (TextView)findViewById(R.id.label);
switch (item.getItemId()) {
case MENU_00:
label.setText(" 打印,菜单 ID:" + item.getItemId());
return true;
case MENU_01:
label.setText(" 新建,菜单 ID:" + item.getItemId());
return true;
case MENU_02:
label.setText(" 邮件,菜单 ID:" + item.getItemId());
return true;
case MENU_03:
label.setText(" 设置,菜单 ID:" + item.getItemId());
return true;
case MENU_04:
label.setText(" 订阅,菜单 ID:" + item.getItemId());
return true;
default:
return false;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menuexample);
}
}
跟第一个方法的区别在于不用写xml文件,而是动态生成菜单栏。
这里通过add方法添加选项和图片。你会发现这两种方法都没显示出我们要的图标,因为这里需要设置图标可见,可以在第一种方法的xml文件中,给每个item加上
app:showAsAction=“ifRoom|withText”(标题栏有空的地方就加上图标)
或app:showAsAction=“always|withText”(通常显示图标),效果如下
二、Intent信息回传
1.效果展示
二、代码实现
这个例子中需要三个activity
主activity的代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/textShow"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""
/>
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=" 启动 Activity1"
/>
<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=" 启动 Activity2"
/>
</LinearLayout>
第一个子activity的代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/textShow"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="SubActivity 1"
/>
<EditText
android:id="@+id/edit"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""
/>
<Button
android:id="@+id/btn_ok"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text=" 接受 "
/>
<Button
android:id="@+id/btn_cancel"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text=" 撤销 "
/>
/>
</LinearLayout>
第二个子activity的代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/textShow"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="SubActivity 2"
/>
<Button
android:id="@+id/btn_return"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text=" 关闭 "
/>
/>
</LinearLayout>
主java文件代码:
package com.example.intentexample;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class mainActivity extends AppCompatActivity {
private static final int SUBACTIVITY1=1;
private static final int SUBACTIVITY2=2;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_intent);
textView=(TextView)findViewById(R.id.textShow);
final Button btn1=(Button)findViewById(R.id.btn1);
final Button btn2=(Button)findViewById(R.id.btn2);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(mainActivity.this,subactivity1.class);
startActivityForResult(intent,SUBACTIVITY1);
}
});
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(mainActivity.this,subactivity2.class);
startActivityForResult(intent,SUBACTIVITY2);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode,resultCode,data);
switch(requestCode){
case SUBACTIVITY1:
if(resultCode==RESULT_OK){
Uri uriData=data.getData();
textView.setText(uriData.toString());
}
break;
case SUBACTIVITY2:
break;
}
}
}
第一个子java文件:
package com.example.intentexample;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class subactivity1 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_subactivity1);
final EditText editText=(EditText) findViewById(R.id.edit);
Button btnOK=(Button) findViewById(R.id.btn_ok);
Button btnCancel=(Button)findViewById(R.id.btn_cancel);
btnOK.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String uriString=editText.getText().toString();
Uri data= Uri.parse(uriString);
Intent result=new Intent(null,data);
setResult(RESULT_OK,result);
finish();
}
});
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setResult(RESULT_CANCELED,null);
finish();
}
});
}
}
第二个子java文件:
package com.example.intentexample;
import android.os.Bundle;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.view.View;
import android.widget.Button;
public class subactivity2 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_subactivity2);
Button btnReturn=(Button) findViewById(R.id.btn_return);
btnReturn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setResult(RESULT_CANCELED,null);
finish();
}
});
}
}
这个例子利用了Intent进行信息回传,主要代码是
Intent result=new Intent(null,data);
setResult(RESULT_OK,result);//把结果码,数据传出去
Intent intent=new Intent(this,subactivity1.class);//打开subacitity1的界面
startActivityForResult(intent,SUBACTIVITY1);//SUBACTIVITY1是给这个界面设置的请求码,目的是可以辨认出是哪个activity界面回传的信息
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){//请求码,结果码,数据
super.onActivityResult(requestCode,resultCode,data);
switch(requestCode){//请求码用来获得是哪个activity回传的信息
case SUBACTIVITY1:
if(resultCode==RESULT_OK){//判断结果类型
Uri uriData=data.getData();//对结果进行解码
textView.setText(uriData.toString());
}
break;
case SUBACTIVITY2:
break;
}
}