美文网首页
第 2 章 - Activity

第 2 章 - Activity

作者: AaronZheng丶 | 来源:发表于2018-08-30 13:25 被阅读0次

    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 中配置想要启动的活动的 <action><category> 信息,并交由系统分析启动哪个活动

    • <action> 的配置信息:
      <action android:name = "包名.ACTION_START"/>

    • <category> 的配置信息:
      <category android:name = "android.intent.category.DEFAULT"/>

    • <category> 可追加:
      addCategory()
      <category android:name = "包名.大写_大写"/>

    调用浏览器功能:

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

          本文链接:https://www.haomeiwen.com/subject/rsbrwftx.html