Android基础——Activity

Activity是什么?

Activity一种可以包含用户界面的组件,用于和用户交互。

创建Activity

选择包new→Activity→Empty Activity,勾选Generate Layout File表示会自动为此Activity创建一个xml布局文件,勾选Launcher Activity表示会自动将此Activity设置为主活动(即进入App后的第一个界面)。通过这种方式创建的Activity会自动在Manifest.xml中注册。

Tips:

  1. 若应用程序未指定主活动,程序仍可安装使用,一般作为第三方服务供内部调用。

Activity通过onCreate()中的setContentView()方法,传入布局文件的id(项目中的任何资源都会在R文件中生成一个相应的资源id),以加载相应的布局。

销毁Activity

通过手机Back按键即可销毁当前活动,在程序中可以通过调用finish()方法销毁

Activity生命周期

返回栈介绍

Android通过任务(Task)来管理活动,一个任务就是一组存放在栈里的活动的集合,这个栈称为返回栈(Back Stack)。每次启动一个新的Activity就会入栈位于栈顶,当按下Back键或者调用finish()方法销毁活动时,栈顶的Activity就会出栈。系统总是显示栈顶的活动给用户。

Activity状态

  • 运行状态:当前Activity位于栈顶。系统不会回收运行状态下的Activity。
  • 暂停状态:当前Activity不在栈顶,但仍然可见,如对话框部分形式的活动只会占据屏幕部分区域。只有在内存极低的情况下,系统才会考虑去回收暂停状态下的Activity。
  • 停止状态:当前Activity不在栈顶,并且完全不可见。需要内存时,系统可能回收暂停状态下的Activity。
  • 销毁状态:当前Activity已从返回栈中移除。系统最倾向于回收销毁状态下的Activity。

Activity生命周期

  • onCreate():当活动第一次被创建时调用,在此方法中完成对活动的初始化操作,如加载布局、绑定事件等。
  • onStart():当活动由不可见变为可见时调用。
  • onResume():当活动位于栈顶时调用,活动变为运行状态。
  • onPause():当系统准备去启动或恢复另一个活动时调用,如启动一个对话框形式的活动,活动变为暂停状态。
  • onStop():当活动完全不可见时调用,活动变为停止状态。
  • onDestory():当活动销毁前调用,活动将变为销毁状态。
  • onRestart():当活动由停止状态变为运行状态之前调用。

在这里插入图片描述

根据以上,活动又可分为3种生存期:

  • 完整生存期:onCreate()——onDestory()
  • 可见生存期:onStart()——onStop()
  • 前台生存期:onResume()——onPause()

应避免在onPause()中进行耗时操作,因为必需在执行完onPause()后新的Activity才能onResume()

横竖屏切换

在应用程序进行横竖屏切换或多窗口模式时,Activity都会重新创建,如在播放视频时,应该在onstop()方法中处理暂停的逻辑,在onStart()方法恢复视频的播放。

在Mainfest.xml中的<Activity>标签加入configChanges属性可以禁止Activity重新创建:

 <activity
            android:name=".MainActivity"
            android:configChanges="orientation|keyboardHidden|screenSize|screenLayout">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

如要禁用多窗口模式,则需要在Mainfest.xml中的<application>添加resizeableActivity属性:

android:resizeableActivity="false"

如要禁用横竖屏切换,可在Mainfest.xml中的<Activity>标签通过screenOrientation指定横竖屏模式:

android:screenOrientation="portrait"

恢复Activity数据

当在MainActivity的文本框输入了一行数据,然后启动OtherActivity,此时MainActivity处于停止状态,若因系统内存不足被回收,当点击Back键返回时,MainActivity被重新创建,但刚刚在文本框的输入数据却不见了。

通过onSaveInstanceState()可以解决上述问题,onSaveInstanceState()会在onStop()之前调用,可以通过这个方法保存临时数据。

onSaveInstanceState()可通过Bundle的putXXX(String,XXX)方法已键值对的方式保存数据,其中XXX可以是基本数据类型或数组,如保存字符串:

@Override
 protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("tempData","Data");
    }

恢复数据可用onCreate()方法中的参数

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState != null) {
            Log.d("MainActivity", savedInstanceState.getString("tempData"));
        }
    }

或者onRestoreInstanceState()方法,区别在于onCreate()在正常启动时,savedInstanceState为空,故需要判空,而onRestoreInstanceState()则必定有值

@Override
    protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
    }

Activity启动模式

standard

默认模式,每次启动新Activity都会创建实例入栈

singleTop

若要启动的Activity已在栈顶,则不会在创建新的实例,但会调用onNewIntent()

通常用于接收消息后显示的界面,不管接收几个消息始终为同一个Activity

singleTask

  • 若在同一个App中启动,且该Activity在返回栈中,则把在其之上的Activity出栈,让其成为栈顶
  • 若在不同App中启动,则会创建新的返回栈
  • 若该Activity的返回栈已存在但在后台,则会切换到前台

如下Activity2启动ActivityY(singleTask),其所在的Task被调度到前台,随后按返回键也是也是先返回ActivityY所在Task中的Activity
在这里插入图片描述

singleInstance

为新Activity启用一个新返回栈,可用于共享Activity实例,如浏览器,若当前未打开,第一次调用则打开浏览器,后续的调用都是在已打开的浏览器中

设置启动模式

  • Mainfest.xml中的<activity>标签下的android:launchMode属性修改Activity的启动模式
  • 通过Intent启动时设置Flag
  • 同时存在时,以第二种方式为准

若启动模式为singleTask或singleInstance的ActivityA,通过startActivityForResult()启动另一个ActivityB

  • 系统将直接返回Activity.RESULT_CANCELED
  • 不同Task默认不能传递数据,数据需通过Intent绑定

相关属性

  • clearTaskOnLaunch:返回Activity时,将在其之上的Activity都清除
  • finishOnTaskLaunch:当离开Activity所处的Task,再次返回时该Acitivty就会被finish掉
  • alwaysRetainTaskState:该Activity所在的Task不会被清除
  • taskAffinity:指定Activity任务栈的名字(默认为包名)
  • allowTaskReparenting:当应用A启动应用B的ActivityC时,按home退出到桌面,再点击启动应用B,此时不是显示应用B的MainActivity,而是ActivityC

Activity使用技巧

知晓当前在哪一个活动

创建BaseActivity继承AppCompatActivity,重写onCreate方法获取并打印当前实例类名:

public class BaseActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("BaseActivity", getClass().getSimpleName());
    }
}

让其他Activity继承BaseActivity,当进入不同Activity时,会打印对应的名称。

随时退出程序

创建ActivityCollector管理Activity,内部用List维护Activity实例,加入增删方法:

public class ActivityCollector {
    public static List<Activity> activities = new ArrayList<>();

    public static void addActivity(Activity activity) {
        activities.add(activity);
    }

    public static void delActivity(Activity activity) {
        activities.remove(activity);
    }

    public static void finishAll() {
        for (Activity activity : activities) {
            if (!activity.isFinishing()) {
                activity.finish();
            }
        }
        android.os.Process.killProcess(android.os.Process.myPid());
    }
}

修改BaseActivity,在onCreate中把当前Activity添加到List,在onDestroy中移除当前Activity:

public class BaseActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("BaseActivity", getClass().getSimpleName());
        ActivityCollector.addActivity(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        ActivityCollector.delActivity(this);
    }
}

此外可通过ActivityCollector.finishAll()在任意地方结束所有Activity退出程序。

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!感谢您的提问。 以下是一个简单的 Android 计数器的基础编码示例: 1. 在 activity_main.xml 文件中添加以下代码: ``` <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/counterTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0" android:textSize="50dp" android:layout_gravity="center_horizontal"/> <Button android:id="@+id/incrementButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Increment" android:layout_gravity="center_horizontal" android:onClick="incrementCounter"/> <Button android:id="@+id/resetButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Reset" android:layout_gravity="center_horizontal" android:onClick="resetCounter"/> </LinearLayout> ``` 2. 在 MainActivity.java 文件中添加以下代码: ``` public class MainActivity extends AppCompatActivity { private int counter = 0; private TextView counterTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); counterTextView = findViewById(R.id.counterTextView); } public void incrementCounter(View view) { counter++; counterTextView.setText(Integer.toString(counter)); } public void resetCounter(View view) { counter = 0; counterTextView.setText(Integer.toString(counter)); } } ``` 3. 运行应用程序,您将看到一个显示当前计数器值的 TextView 和两个按钮:Increment 和 Reset。单击 Increment 按钮将增加计数器值,单击 Reset 按钮将将计数器值重置为零。 希望这可以帮助您入门 Android 编程!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值