第 2 章 - Activity

1. 在活动中使用 Menu

准备工作:
  • res 文件夹下创建 menu 文件夹,并生成菜单文件(xml格式)
Activity 中有 2 个重要方法需要复写:
  • 此方法用于创建菜单,返回值为 true 表示将菜单显示出来
    public boolean onCreateOptionsMenu(Menu menu)

  • 此方法用于创建菜单子项,可用 getItemId()获取相对应 item
    public boolean onOptionsItemSelected(MenuItem item)

2. 销毁一个活动

  • finish()

3. 隐式 Intent

不在活动中明确指出启动哪个活动,而是在 AndroidManifest.xml 中配置想要启动的活动的 信息,并交由系统分析启动哪个活动

  • 的配置信息:

  • 的配置信息:

  • 可追加:
    addCategory()

调用浏览器功能:

Intent intent = new Intent(Intent_ACTION_VIEW)
intent.setData(Uri.parse("http://www.baidu.com"))
—— Intent.ACTION_VIEW 的常量值为 android.intent.action.VIEW
如果在 AndroidManifest.xml 中配置活动的 值为此常量值,那么该活动也能响应打开网页的 Intent

调用拨号功能:

Intent intent = new Intent(Intent.ACION_DIAL)
intent.setData(Uri.parse("tel:10010"))

4. 向下一个活动传递数据:

发送数据:

intent.putExtra()
—— 该方法接收键值对参数

接收数据:

intent.getIntent()
—— 该方法用于获取到启动目标活动的 Intent
getIntExtra()getStringExtra()
—— 此类方法传入相应的键值即可获得数据

5. 返回数据给上一个活动:

  • Activity 中有一个 void startActivityForResult() 方法也用于启动活动,以此方法启动的活动在销毁时可以返回数据给上一个活动,void startActivityForResult() 接收 2 个参数,第一个是 Intent,第二个是 requestCode,需要是唯一值,用于在之后的回调方法中判断数据来源

  • 当目标活动想要回传数据,则需要调用 setResult() 方法,此方法是专门用于向上一个活动返回数据的,接收 2 个参数,第一个用于向上一个活动返回处理结果,一般是 RESULT_OK;第二个是携带数据的 Intent

  • 当活动销毁后会回调上一个活动的 void onActivityResult() 方法,因此需要复写此方法:
    protected void onActivityResult(int requestCode,int resultCode,Intent data)
    方法体内首先判断 requestCode 的值,接着判断 resultCode 的结果

  • 如果希望按下 Back 键也能返回数据,则复写 void onBackPressed() 方法即可,将返回数据的逻辑在方法体内再编写一次

6.活动被回收了怎么办:

  • 想要保存活动的临时数据可复写 void onSaveInstance() 方法,在此方法中可用 BundleputInt() , putString() 等方法将数据传入 Bundle,接着在 void onCreate() 方法中判断 savedInstanceState 是否为空,不为空即可用 getInt() , getString() 等方法取出数据
@Override
protected void onSaveInstance(Bundle outState){
    super.onSaveInstanceState(outState);
}

7.活动的启动方式:

  • standard:即使活动位于栈顶,依然能从此活动创建新实例
  • singleTop:活动位于栈顶时不能创建新实例
  • singleTask:返回栈中仅会存在单个活动的单个实例
  • singleInstance:启用新的返回栈来管理所启动的新活动

8.管理所有活动:

  • 创建一个 BaseActivity 基类,继承自 AppCompatActivity,并复写 void onCreate() 方法,让所有活动继承 BaseActivity
    Log.d("BaseActivity",getClass().getSimpleName())
    可以知道当前进入的是哪个活动

  • 创建 ActivityColector 类作为活动管理器:
    首先定义一个 List 来管理活动
    private static List activities = new ArrayList<>()
    定义添加移除全局退出这三个静态成员方法

public static void addActivity(Activity activity){
    activities.add(activity);
}
public static void removeActivity(Activity activity){
    activities.remove(activity);
}
public static void finishAll(){
    //遍历 activities
    for(Activity activity : activities){
        //判断是否被系统回收
        if(!activity.isFinishing()){
            activity.finish();
        }
    }
    //清空列表
    activities.clear();
}
  • 最后在 BaseActivity
    void onCreate() 方法中添加 ActivityCollector.addActivity(this)
    void onDestroy() 方法中添加 ActivityCollector.removeActivity(this)
  • 基于 BaseActivity,任何子类活动皆可调用 void finishAll() 方法来执行退出程序的功能。另外,想要完全退出程序还可以调用下面的方法
    android.os.Process.killProcess(android.os.Process.myPid())
    此方法用于杀掉当前进程,它接收一个进程 id 参数,通过 myPid() 方法可以获得当前程序的进程 id

9.启动活动的最佳写法:

  • 为每个活动添加静态方法 void actionStart(Context context),参数至少需要有一个 Context 对象,如需要传递数据则添加相应的数据类型即可
public static void actionStart(Context context){
    Intent intent = new Intent(context,Activity.class);
    context.startActivity(intent);
}

你可能感兴趣的:(第 2 章 - Activity)