通俗点来说,一个activity就是一个屏幕,在这个屏幕有各种组件共同组成一个界面。
创建activity
一、第一种方式
通过右击包名——New——Activity——Empty Activity,会看到类似于下面的界面,输入Activity和布局的名字,☑️Generate a Layout 后,Android系统会自动为我们创建布局,且在AndroidManifest.xml文件中自动注册当前Activity。
二、第二种方式
- 第一步:右击包名——New——JavaClass——输入Activity Name,例如Create Activity,
- 第二步:在AndroidManifest文件中注册Activity
在 application 标签中写入如下代码:
<activity android:name=".CreateActivity"
android:label="创建">
</activity>
- 右击layout——New—— Layout Resource File——输入布局名称
- 在 Create Activity.java 文件中写入下面的代码
所有的Activity都要继承Activity,所有的活动都需要重写onCreate()方法,并在onCreate()方法中引用布局,才可使用
package com.xiaozeng.shareapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class FourthActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create);
}
}
Activity 的启动和结束
启动
Activity的启动方法也可以叫做Activity间的跳转,从一个Activity 跳转到另一个Activity。在Android中,Activity的启动是通过Intent来表达的,Intent是组件之间通信的媒介,专门提供组件互相调用的相关信息,Intent的启动方式,大的方向上可以分为两种: 显示跳转和隐式跳转
显示启动
- 第一种方式:class 跳转,主要的作用就是使得MainActivity页面启动后,会紧接着启动跳转到other页面
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
Intent intent =new Intent(MainActivity.this,other_activity.class);
startActivity(intent);
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
}
}
- 第二种方式:包名.类名跳转,根上一种方式基本相同就是使用了绝对路径进行跳转
Intent intent = new Intent();
intent.setClassName(FirstActivity.this,"com.xiaozeng.launchapplication.SecondActivity");
startActivity(intent);
- 第三种方式:ComponentName跳转效果与前两种一样,相比之前的跳转更加灵活,可以跳转其他应用app的页面,例如拨号,摄像界面
Intent intent = new Intent()
ComponentName componentName = new ComponentName(FirstActivity.this,SecondActivity.class);
intent.setComponent(componentName);
startActivity(intent);
隐式启动
- 创建一个mainactivity,然后点击注册页面的xml文件
- 在主页面的activity标签中添加以下内容就可以使得他变为启动页面了
<activity
android:name=".MainActivity"
android:exported="true"
android:theme="@style/Theme.MyApplication" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
两者区别
- 显式启动需要明确指定要启动的组件,而隐式启动不需要指定目标组件,而是指定动作和数据类型,让系统去匹配合适的组件。
- 显式启动主要用于在应用内部启动目标组件,而隐式启动主要用于在应用外或者不确定目标组件的情况下启动组件。
结束
也就是相当于起到了返回上一页的功能
finish(); // 结束当前的活动页面
生命周期
由生到死状态转化的过程,在特定的周期做特定的事情
生命周期的6种状态
- 创建(Created):Activity 创建后,会执行 onCreate() 方法。在这个阶段,通常会进行一些初始化工作,比如设置布局、绑定数据等。
- 启动(Started):在 Activity 启动时,会执行 onStart() 方法。这时候 Activity 已经对用户可见,但还没有获得焦点。在这个阶段,通常进行一些开始加载数据、初始化 UI 界面等操作。
- 运行(Resumed):当 Activity 进入前台并获得焦点时,会执行 onResume() 方法。这时用户可以与 Activity 进行交互,Activity 处于活动状态。在这个阶段,通常执行一些需要持续交互的操作,比如动画效果、传感器监听等。
- 暂停(Paused):当其他 Activity 部分或完全遮挡当前 Activity 时,当前 Activity 会进入暂停状态,执行 onPause() 方法。在这个阶段,可以暂停一些需要暂停的任务,但仍然保持 UI 状态和部分资源。
- 停止(Stopped):当 Activity 完全不可见时,会执行 onStop() 方法。这可能是因为用户导航到了其他 Activity,或者当前 Activity 被暂停、销毁。在这个阶段,通常可以释放一些资源、保存一些持久化数据等。
- 销毁(Destroyed):当 Activity 被销毁时,会执行 onDestroy() 方法。这时候 Activity 即将被彻底销毁,释放所有资源。在这个阶段,通常执行一些释放资源、取消注册监听器等清理工作。
生命周期的几种方法
- onCreate() : 在Activity创建时调用,通常做一些初始化设置;
- onStart(): 在Activity即将可见时调用;
- onResume(): 在Activity已可见,获取焦点开始与用户交互时调用;
- onPause(): 在当前Activity被其他Activity覆盖或锁屏时调用;
- onStop() : 在Activity对用户不可见时调用;
- onDestroy() :在Activity销毁时调用;
- onRestart() : 在Activity从停止状态再次启动时调用;就可以像Studio中的Logcat窗口中显示日志信息:
启动模式
静态设置启动模式
<activity
android:name=".activity.MainActivity"
android:exported="true"
android:label="123456"
android:launchMode="standard"
android:theme="@style/Theme.MyApplication">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
模式介绍
默认启动模式 standard
该模式可以被设定,不在 manifest 设定时候,Activity 的默认模式就是 standard。在该模式下,启动
的 Activity 会依照启动顺序被依次压入 Task 栈中:
栈顶复用模式 singleTop
在该模式下,如果栈顶 有即将跳转的Activity ,则直接用栈顶的activity为我们要新建的 Activity(目标Activity),那么就不会重复创建新的,如果过没有就创建新的。
Activity。
应用场景
适合开启渠道多、多应用开启调用的 Activity(微信支付),通过这种设置可以避免已经创建过的 Activity 被重复创建,多数通过动态设置使用。
栈内复用模式 singleTask
与 singleTop 模式相似,只不过 singleTop 模式是只是针对栈顶的元素,而 singleTask 模式下,如果
task 栈内存在目标 Activity 实例,则将 task 内的对应 Activity 实例之上的所有 Activity 弹出栈,并将对
应 Activity 置于栈顶,获得焦点。
应用场景
程序主界面:我们肯定不希望主界面被创建多次,而且在主界面退出的时候退出整个 App 是最好的效
果。
耗费系统资源的Activity:对于那些及其耗费系统资源的 Activity,我们可以考虑将其设为 singleTask
模式,减少资源耗费。
全局唯一模式 singleInstance
在该模式下,我们会为目标 Activity 创建一个新的 Task 栈,将目标 Activity 放入新的 Task,并让目标
Activity获得焦点。新的 Task 有且只有这一个 Activity 实例。
如果已经创建过目标 Activity 实例,则不会创建新的 Task,而是将以前创建过的 Activity 唤醒。
事例:
看一个示例,Activity3 设置为singleInstance,Activity1 和 Activity2 默认(standard),下图程序流程
中,黄色的代表 Background 的Task,蓝色的代表 Foreground 的Task。返回时会先把 Foreground 的
Task 中的 Activity 弹出,直到 Task 销毁,然后才将 Background的 Task 唤到前台,所以最后将
Activity3 销毁之后,会直接退出应用。
动态设置启动模式
iIntent intent =new Intent(MainActivity.this, ProfileActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
(一) FLAG_ACTIVITY_CLEAR_TOP的使用
- 创建两个空的activity界面
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".JumpActivity1">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/jumpToSecond"
android:text="跳转到第二个页面"
tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".JumpActivity2">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/jumpToFirst"
android:text="跳转到第一个页面"
tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>
- 设置点击跳转activity事件,并设置启动模式都为FLAG_ACTIVITY_CLEAR_TOP
public class JumpActivity1 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_jump1);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
findViewById(R.id.jumpToSecond).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(JumpActivity1.this, JumpActivity2.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
});
}
}
public class JumpActivity2 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_jump2);
findViewById(R.id.jumpToFirst).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(JumpActivity2.this, JumpActivity1.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
});
}
}
- 实现效果,大概就是将b消除然后返回a,然后如果点击手机自带返回就会退出应用。
(二) Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK的使用
- 随便一个界面写一个按钮点击,然后设置这两种启动模式,
@Override
public void onClick(View v) {
Intent intent =new Intent(MainActivity.this, ProfileActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
- 实现效果:大概是点击登录跳转首页之后,如果再点击返回界面那么会直接退出本应用
- FLAG_ACTIVITY_CLEAR_TASK:清楚包括现在展示的界面在内的所有activity,
FLAG_ACTIVITY_NEW_TASK:为当前界面创建一个activity,
如果不使用FLAG_ACTIVITY_NEW_TASK那么FLAG_ACTIVITY_CLEAR_TASK完成之后又会重新创建之前已经删除的activity。
显示Intent和隐式Intent
概念:
Intent意思是意图,主要作用是用于android各个组件之间的通信,作用如下:
- 表明通信方向和目的地,也就是要去哪里,从哪里来
- 通过通信传递数据
- 将传递的数据后的结果返还给起点通信组件
显式Intent
直接指定来源活动与目标活动,属于精确匹配。它有三种构建方式:
- 在Intent的构造函数中指定。
- 调用意图对象的setClass方法指定。
- 调用意图对象的setComponent方法指定。
三种方式
- 第一种方式:class 跳转,主要的作用就是使得MainActivity页面启动后,会紧接着启动跳转到other页面
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
Intent intent =new Intent(MainActivity.this,other_activity.class);
startActivity(intent);
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
}
}
- 第二种方式:包名.类名跳转,根上一种方式基本相同就是使用了绝对路径进行跳转
Intent intent = new Intent();
intent.setClassName(FirstActivity.this,"com.xiaozeng.launchapplication.SecondActivity");
startActivity(intent);
- 第三种方式:ComponentName跳转效果与前两种一样,相比之前的跳转更加灵活,可以跳转其他应用app的页面,例如拨号,摄像界面
Intent intent = new Intent()
ComponentName componentName = new ComponentName(FirstActivity.this,SecondActivity.class);
// ComponentName componentName = new ComponentName(FirstActivity.this,"包名");
intent.setComponent(componentName);
startActivity(intent);
隐式Intent
Intent 类的系统动作常量名系统动作的常量值说明
- ACTION_MAIN android.intent.action.MAIN App启动时的入口
- ACTION_VIEW android.intent.action.VIEW 向用户显示数据
- ACTION_SEND android.intent.action.SEND 分享内容
- ACTION_CALL android.intent.action.CALL 直接拨号
- ACITON_DIAL android.intent.action.DIAL 准备拨号
- ACTION_SENDTO android.intent.action.SENDTO 发送短信
- ACTION_ANSWER android.intent.action.ANSWER 接听电话
使用例子
findViewById(R.id.jumpToPhone).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DIAL);
Uri uri = Uri.parse( "tel:"+"123456");
intent.setData(uri);
startActivity(intent);
}
});
findViewById(R.id.jumpToSend).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SENDTO);
Uri uri = Uri.parse( "smsto:"+"123456");
intent.setData(uri);
startActivity(intent);
}
});
跳转传值
- 点击跳转事件
@Override
public void onClick(View v) {
Intent intent =new Intent(MainActivity.this, ProfileActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
Bundle bundle = new Bundle();
bundle.putString("status","登录成功");
intent.putExtras(bundle);
startActivity(intent);
}
- 跳转到的页面接收
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_profile);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
Log.i("Main","onCreate2");
String values[]={"hjh","1","18951307053","2002-02-21","江苏省南通市开发区"};
String titles[]={"用户名","性别","手机号","出生年月","家庭住址"};
List<News> dataList = new ArrayList<>();
for (int i = 0; i <values.length; i++) {
dataList.add(new News(titles[i],values[i]));
}
MyAdapter mAdapter = new MyAdapter(dataList);
mRecyclerView = findViewById(R.id.recycleView);
mRecyclerView.setAdapter(mAdapter);
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);
mRecyclerView.addItemDecoration(dividerItemDecoration);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
TextView tv_receive = findViewById(R.id.ifLogin);
Bundle bundle = getIntent().getExtras();
String status = bundle.getString("status");
tv_receive.setText(status);
}
向上一个界面返回数据
- 编写界面1代码
<TextView
android:id="@+id/ifLogin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="登录失败"
android:textSize="40sp"
android:gravity="center"
app:layout_constraintBottom_toBottomOf="@+id/recycleView"
app:layout_constraintTop_toTopOf="@+id/recycleView"
tools:ignore="MissingConstraints" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/resultForResponse"
android:text="跳转下一下页面"
android:textSize="29dp"
app:layout_constraintBottom_toBottomOf="@+id/recycleView"
app:layout_constraintRight_toRightOf="@id/ifLogin"
tools:ignore="MissingConstraints,OnClick" />
- 编写返回数据接收器以及跳转功能
public class ProfileActivity extends AppCompatActivity {
RecyclerView mRecyclerView;
ActivityResultLauncher<Intent> register;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_profile);
TextView tv_receive = findViewById(R.id.ifLogin);
Bundle bundle = getIntent().getExtras();
String status = bundle.getString("status");
tv_receive.setText(status);
//跳转第二个界面
findViewById(R.id.resultForResponse).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(ProfileActivity.this, TestActivity.class);
Bundle bundle = new Bundle();
bundle.putString("status", "你好");
intent.putExtras(bundle);
register.launch(intent);
}
});
//返回数据接收
register = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if (result != null) {
Intent data = result.getData();
Bundle extras = data.getExtras();
String response = extras.getString("response");
tv_receive.setText(response);
}
}
});
}
- 编写接收数据代码,以及返回事件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".activity.TestActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="接收页面"
android:textSize="30dp"
android:id="@+id/receive"
tools:ignore="MissingConstraints" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="返回"
android:textSize="30dp"
android:id="@+id/backs"
tools:ignore="MissingConstraints" />
</LinearLayout>
public class TestActivity extends AppCompatActivity {
private View view1, view2, view3;
private ViewPager viewPager; //对应的viewPager
private List<View> viewList;//view数组
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
// 接收数据并将接收到的数据显示在文本
TextView textView=findViewById(R.id.receive);
Bundle extras = getIntent().getExtras();
String status = extras.getString("status");
textView.setText(status);
// 点击事件,销毁当前界面并返回一些数据
findViewById(R.id.backs).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("response","我不好");
intent.putExtras(bundle);
setResult(Activity.RESULT_OK,intent);
finish();
}
});
}}
为activity补充附加信息
利用资源文件配置属性
- 打开values文件夹,点击string.xml文件
- 添加属性
<resources>
<string name="app_name">My Application</string>
<!-- Strings used for fragments for navigation -->
<string name="first_fragment_label">First Fragment</string>
<string name="second_fragment_label">Second Fragment</string>
<string name="next">Next</string>
<string name="previous">Previous</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
<string name="weather1">晴天</string>
</resources>
- 随便创建一个textView,给他设置id属性,然后就直接对他的text进行设置
@SuppressLint({"MissingInflatedId", "LocalSuppress"})
TextView textView=findViewById(R.id.testText);
textView.setText(R.string.weather1);
效果如下:
利用元数据传递配置信息
一般就是使用第三方应用的sdk,会获取一些唯一配置学习,比如token,key,secret等等,那么一般就是使用元数据进行配置,比如地图,微信之类的。
- 将配置信息,以元数据的形式存入AndroidManifest.xml文件的对应activity的配置中去
<activity
android:name=".activity.TextSizeActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- TODO 1. 注册元数据-->
<meta-data
android:name="weather"
android:value="晴天" />
</activity>
- 读取元数据并设置text为元数据内容
@SuppressLint({"MissingInflatedId", "LocalSuppress"})
TextView textView = findViewById(R.id.testText);
PackageManager packageManager = getPackageManager();
try {
//从应用包管理器中湖区当前活动的信息,getComponentName()获取当前活动的名字XXActivity,PackageManager.GET_META_DATA要获取什么信息
ActivityInfo info = packageManager.getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);
// 获取活动附加的元数据信息
Bundle bundle = info.metaData;
String weather = bundle.getString("weather");
textView.setText(weather);
} catch (PackageManager.NameNotFoundException e) {
throw new RuntimeException(e);
}
如图所示:
利用元数据实现注册应用页面注册快捷方式
- 在res文件夹的xml文件夹中创建一个shortcuts.xml文件,并编辑以下代码
android:targetClass="com.example.myapplication.activity.MainActivi
<!-- 快捷称呼必须在资源文件中编写,不能直接写不然会报错
android:shortcutLongLabel="@string/app_name"
android:shortcutShortLabel="@string/app_name">-->
<!-- icon图标图片地址-->
<shortcut
android:enabled="true"
android:icon="@mipmap/ic_launcher"
android:shortcutId="first"
android:shortcutLongLabel="@string/app_name"
android:shortcutShortLabel="@string/app_name">
<!-- android:targetPackage="com.example.myapplication" 指定页面启动注册包-->
<!-- android:targetClass="com.example.myapplication.activity.MainActivity"/> 启动的具体activity-->
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.example.myapplication"
android:targetClass="com.example.myapplication.activity.MainActivity"/>
<!-- 指定快捷方式-->
<categories android:name="android.shortcut.conversation"/>
- 在启动类中设定元数据地址也就是上方那个文件
<activity
android:name=".activity.TextSizeActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- TODO 1. 注册元数据-->
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</activity>
实现效果如下:点击就会跳转android:targetClass="com.example.myapplication.activity.MainActivity界面