Android第一行代码--活动

Activity

什么是Activity?

Activity包含用户组件用于与用户进行交互。

onCreate()方法

每个Activity都需要继承父类的OnCreate()方法

setContentView()方法

给当前的活动加载一个布局

1
setContentView(布局文件的id);

项目中添加任何资源都会在R文件中生成一个相应的资源id

布局文件涉及的元素

  • Button:插入一个按钮
1
<Button />
  • android:id=@+id/id_name:定义一个名为id_nameid
  • android:id=@id/id_name:引用一个名为id_nameid
  • android:layout_width:指定当前元素的宽度
  • andorid:layout_height:指定当前元素的高度
  • match_parent:当前元素与父元素一样宽
  • android:text:指定元素内显示的文字内容
  • wrap_content:当前元素的高度/宽度刚好能够包含内容

AndroidManifest文件中注册

  • 活动注册声明需要放在<application>标签内

  • 通过<activity>标签进行注册

    • andorid:name指定注册的activity
    • 由于<manifest>标签已经标明程序包名,因此使用.FirstActivity即可标明activity
    • <intent-filter>标签用于标明哪个活动首先启动,若没有定义主活动,那么该活动无法在启动器中看到或打开,该活动通常作为第三方服务器供其他应用在内部调用。
    1
    2
    <action android:name="android.intent.action.MAIN"/>
    <category android:name="android.intent.category.LAUNCHER"/>
  • <android:label>:指定活动中标题栏的内容,标题栏在活动的最顶部

Toast

ToastAndroid系统提供的提醒方式。

1
2
3
4
5
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(FirstActivity.this, "You clicked Button 1", Toast.LENGTH_SHORT).show();
  • findViewById()方法用于获取在布局文件中定义的元素。
    • 返回值:View对象
  • setOnClickListener()方法为按钮注册一个监听器,点击按钮则会执行监听器中的OnClick()方法。
  • Toast()方法有三个参数
    • 参数一:Context即是Toast要求的上下文,活动本身就是一个Context对象,因此将当前活动传入
    • 参数二:Toast显示的内容
    • 参数三:显示时长
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/add_item"
android:title="Add"
/>
<item
android:id="@+id/remove_item"
android:title="Remove"
/>
</menu>
  • <item>:用于创建具体的某一个菜单项
  • android:id:给菜单项指定唯一的标识符
  • android:title:给这个菜单项指定一个名称

onCreateOptionsMenu()方法

1
2
3
4
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
  • getMenuInflater()方法用于获取Menuinflate对象
  • inflate()方法用于给当前活动创建菜单
    • 参数一:通过哪个资源文件来创建菜单
    • 参数二:指定我们的菜单项加载到哪一个Menu对象
    • 返回值:布尔值
      • true代表允许创建的菜单显示出来
      • false代表菜单无法显示

onOptionsItemSelected()方法

用于判断我们点击的是哪一个菜单项

1
2
3
4
5
6
7
8
9
10
11
12
13
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId())
{
case R.id.add_item:
Toast.makeText(this,"You clicked Add",Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(this,"You clicked remove",Toast.LENGTH_SHORT).show();
break;
default:
}
return true;
}

销毁活动

  • 点击Back
  • 使用finsh()方法

Intent

IntentAndroid程序中各组件之间进行交互的一种重要方式

  • 用于指定当前组件想要执行的动作
  • 在不同组件之间传递数据
  • 可用于启动活动、服务、广播等场景。

显式Intent

构造方法Intent(Context packageContext, Class<?>cls)

  • 第一个参数:启动活动的上下文
  • 第二个参数:想要启动的目标活动

StartActivity()方法:

  • 参数一:Intent参数
  • 用于启动目标活动

隐式Intent

隐式Intent不明确指出想要启动哪个活动,而是指定actioncategory,然后由系统分析哪个Intent,并找出合适的活动。

<activity>标签下配置<intent-filter>内容用于指定活动能够相应的actioncategory

1
2
3
4
5
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
1
Intent intent = new Intent("com.example.activitytest.ACTION_START");

更多隐式Intent的用法

隐式Intent不仅可以启动自己程序内的活动,还可以其他程序的活动。

1
2
3
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://www.baidu.com"));
startActivity(intent);
  • Uri.parse()方法将网址字符串解析成一个Uri对象
  • setData()方法接受一个Uri对象,用于指定当前Intent正在操作的数据。
  • <data>标签:用于更加准确地指定当前活动能够响应什么类型地数据。
    • android:scheme用于指定数据的协议
    • android:host指定数据的主机名
    • android:port指定端口
    • android:path指定路径
    • andorid:mimeType:指定处理的数据类型

向下一个活动传递数据

1
2
3
4
5
6
7
8
9
//FirstActivity
String data = "Hello SecondActivity";
.....
intent.putExtra("extra_data",data);

//SecondActivity
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity",data);
  • putExtra()用于传递数据

    • 参数一:键值
    • 参数二:需要传递的数据
  • getIntent()方法用于获取到启动SecondActivityIntent

  • getStringExtra()方法用来获取传递的数据

返回数据给上一个活动

startActivityForResult()方法:用于启动活动,与startActivity()方法不同的是该方法可以在活动销毁时返回一个结果给上一个活动。

  • 参数一:intent对象
  • 参数二:请求码,用于标识请求的Activity
1
2
3
4
5
6
7
8
9
//FirstActivity
...
startActivityForResult(intent,1);
...
//SecondActivity
...
intent.putExtra("data_return","Hello FirstActivity");
setResult(RESULT_OK,intent);
finish();

setResult()方法

  • 参数一:用于向上一个活动返回处理结果
  • 参数二:将带有数据的Intent传递回去

使用startActivityForResult()方法启动的活动,在被销毁时会毁掉上一个活动的onActivityResult()方法,因此需要重写onActivityResult()方法来得到返回的数据。

1
2
3
4
5
6
7
8
9
10
11
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
switch (requestCode){
case 1:
if(resultCode == RESULT_OK)
{
String returnedData = data.getStringExtra("extra_data");
Log.d("FirstActivity",returnedData);
}
}
}

onActivityResult()方法

  • 参数一requestCode:启动活动时传入的请求码
  • 参数二resultCode:返回数据时传入的处理结果
  • 参数三data:携带返回数据的Intent

当点击Back按键时,需要重写需要销毁活动中的onBackPressed()

1
2
3
4
5
6
7
8
@Override
public void onBackPressed() {
Intent intent = getIntent();
String data = "Hello MainActivity";
intent.putExtra("extra_data",data);
setResult(RESULT_OK,intent);
finish();
}

活动的生命周期

返回栈

Android使用任务(Task)来管理活动,一个任务就是一组放在栈里的活动的集合,这个栈被称之为活动栈(Back Stack)。

活动状态

  • 运行状态:处于栈顶的活动
  • 暂停状态:不处于栈顶但是仍然可见
  • 停止状态:不处于栈顶且不可见,当需要内存时,停止的活动就会被系统回收
  • 销毁状态:当一个活动移除栈中就处于该状态

活动的生成期

Activity类定义的7个回调方法对应活动的生命周期

  • onCreate():活动第一次被创建时调用,该方法完成初始化操作。
  • onStart():该方法由不可见转化为可见时调用
  • onResume():该方法在准备好和用户进行交互的时候调用,此时该活动一定处于栈顶
  • onPause():这个方法在系统准备启动或者恢复另一个活动的时候调用
  • onStop():这个方法在活动完全不可见的时候调用。与onPause()方法的区别在于,若启动一个新的活动是对话框的活动那么onPause()方法会调用但是onStop()方法不会被调用
  • onDestory():这个方法在活动被销毁之前调用,之后该活动的状态变为销毁状态
  • onRestart():这个方法在活动由停止状态变为运行状态之前调用
  • 完整生存期:活动在onCreate()方法和onDestory()方法之间所经历的。
  • 可见生存期:活动在onStart()方法和onStop()方法之间所经历的
  • 前台生存期:活动在onResume()方法和onPause()方法之间所经历的

image-20220117175350351

活动被回收

当活动A调用活动B,活动B返回活动A时,活动A已经被回收,此时会通过onCreate()重新创造活动A,但是此时在活动A的数据会消失,在活动销毁之前会调用onSaveInstanceState()方法。该方法写到Bundle类型的参数,并且听过方法用于保存数据。

1
2
3
4
5
6
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String tempData = "Something you just typed";
outState.putString("data_key",tempData);
}

onCreate()方法存在参数Bundle

活动的启动模式

启动模式有4种,分别是standardsingleTopsingleTasksingleInstance,可以通过android:launchMode属性选择启动模式。

  • standard:就是默认的模式,使用返回栈存储活动,即使调用的活动已经在栈顶,仍然会将该活动当成新的栈顶。此时栈中就会存在两个相同的活动。

  • singleTop:会改进standard模式,当调用的活动已经存在栈顶时,不会再调用。但是会出现这种情况当活动A调用活动B,活动B再次调用活动A时,栈的情况A-->B-->A ,此时栈上会出现两个活动A的实例。

  • singleTask:解决singleTop出现多个相同实例的情况,若发现需要调用的活动,在栈上存在实例则直接取出该实例,而不会另外新增一个该活动的实例。并且把该活动之上的所有实例弹出栈。

  • singleInstance:指定了singleInstance模式的活动会启用一个新的返回栈来管理这个活动。此时可以实现其他程序与自己的程序共享一个活动的实例,由于每个程序有自己的一个返回栈,若不采用该启动模式,相同活动在不同的返回栈中存在不同的实例也就不可能共享相同的实例了。


Android第一行代码--活动
https://h0pe-ay.github.io/Android第一行代码--活动/
作者
hope
发布于
2023年6月27日
许可协议