Android--Activity(活动)

时间:2023-03-08 22:27:17

Android--Activity(活动)

1. 安卓中的 Activity 大致等于桌面应用中的window

2. Activity 的生命周期由系统控制, 所以在开发时要假设 Activity 会被随时销毁掉的情况,

比如: 应用中有一个 ActivityA,用户在 ActivityA 的基础上启动了 ActivityB, ActivityA 就进入了停止状态,这个时候由于系统内存不足,将ActivityA销毁掉了,然后用户按下 Back 键要返回 ActivityA 时, 会出现什么情况呢?

此时, ActivityA 还是会正常显示, 不过这时显示的ActivityA 并不是之前的 ActivityA, 而是系统重新创建的, 所以不会调用 OnRestart 方法, 而是调用 OnCreate 方法.

这样就又产生了一个新问题,  如果ActivityA 中有一些临时数据, 比如文本框控件中输入的值, 这些数据要如何保存?

此时, 可以使用 OnSaveInstanceState 回调方法, 安卓系统保证此方法会在 Activity 被销毁前调用, 所以可在此方法中保存数据, OnSaveInstanceState 有一个Bundle 类型的参数对象, 此对象用于保存数据, 之后当 OnCreate 方法被调用时会传入此对象.

3. 一个App 中可以有多个 Activity , 每个Activity 都必须在 manifest 文件中注册后才可使用,

为Activity(活动) 设置 intent-filter(意图过滤器) 以便让系统自动启动相应Activity , 比如将Activity 的 intent-filter 设置为

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

这样, 此Activity 将作为App 的主Activity ,运行此app 时将默认启动此Activity (类似于桌面应用的主窗口)

4. 当系统接收到一个意图后, 将搜索所有在系统中注册的Activity ,根据其设置的intent-filter 找到最匹配的Activity ,然后启动Activity .如果找到多个匹配项, 则弹出程序选择框(类似于windows中打开一个未指定默认程序的文件, 不同点在于, 安卓中运行程序后并不一定会打开主窗口, 而是直接启动匹配意图的相应窗口)

5. Activity 保存在一个后进先出栈中, 创建一个新Activity时, 会向栈中压入此Activity, 所以此Activity显示在最顶层, 按下返回键时会销毁当前 Activity, 重新显示上一个 Activity

6. 可调用 Activity 的 Finish 方法销毁实例自身, 调用此方法后并不是立即销毁, 还会依次执行 OnPause, OnStop, OnDestroy 方法. (类似于Window.Close方法)

7. 新建 Activity (Xamarin.Android)

例1: 创建一个意图, 根据此意图启动活动窗口, 此意图对象可携带数据

        private void BtnNew_Click(object sender, EventArgs e)
{
//throw new NotImplementedException();
//创建一个意图对象, 指定上下文参数为this, 要创建的活动为TestActivity
Intent intent = new Intent(this, typeof(TestActivity));
//向意图中压入数据(键值对), 用于传递数据
intent.PutExtra("Key1", "TestText");
intent.PutExtra("Key2", );
//创建活动
StartActivity(intent);
}

在活动中可取出意图中携带的数据

        private void Btn1_Click(object sender, EventArgs e)
{
//throw new NotImplementedException();
//获取数据时要根据数据的类型使用相应的方法
string key1 = this.Intent.GetStringExtra("Key1");
int key2 = this.Intent.GetIntExtra("Key2", );
Toast.MakeText(this, String.Format("key1:{0}, key2:{1}", key1, key2), ToastLength.Long).Show();
}

例2: 直接启动

StartActivity(typeof(TestActivity));

8. 隐藏窗口标题栏

在调用 SetContentView(Resource.Layout.Main); 之前调用 RequestWindowFeature(WindowFeatures.NoTitle);