Android学习-2(探究Activity)

学习基于《第一行代码》第二章(郭霖)

重写方法的快捷键:Ctrl+0(Mac为control+O)

一、在Activity中使用Menu

  1. 新建menu.xml

    <menu>
    	<item
    			android:id="@+id/add_item"
    			android:title="Add"/>
    	<item
    		android:id="@+id/remove_item"
    		android:title="Remove"/>	
    </menu>
    
  2. 在Activity中重写onCreateOptionsMenu()来获取到该menu

     public boolean onCreateOptionsMenu(Menu menu)
           {
            	getMenuInflater().inflate(R.menu.menu,menu);
            	return true;
            }
    
  3. 在Activity中重写onOptionsItemSelected()来定义菜单响应事件

    public boolean onOptionsItemSelected(MenuItem item){
    switch(item.getItemId()){
    ...
     }
     return true;
    }
    

二、用Intent跳转Activity

隐式Intent

1、普通跳转
需要<action><category>中的内容同时匹配上Intent中指定的action和category,如

Intent intent = new intent("com.example.activitytest.ACTION_START");
intent.addCategory("com.example.activitytest.MY_CATEGORY");

在mainfest中:

 <intent-filter>
 	<action android:name="com.example.activitytest.ACTION_START" />
 	<category android:name="com.example.activitytest.MY_CATEGORY"/>
 </intent-filter>

2、更多用法
使用隐式Intent,不仅可以启动程序内的活动,还可以启动其他程序的活动。如打开一个网站:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Url.parse("http://www.baidu.com"));

返回数据给上一个活动

有2个activity(Activity1,Activity2,其对应的布局文件分别有Btn_1和Btn_2)

  1. 在Activity1的按钮点击事件中:

     Intent intent = new Intent(MainActivity.this, Activity2.class);
     startActivityForResult(intent,1);
    

这里的1为请求码,只要是唯一值就可以了。

  1. 在Activity2的按钮点击事件中设置回传

         Intent intent = new Intent();
         intent.putExtra("data_return","Hello FirstActivity");
         setResult(RESULT_OK,intent);
         finish();
    

一般只使用RESULT_OK,RESULT_CANCELED这两个值
这段代码必须放在finish前面,即不能放在onPause(),onStop(),onDestroy()中
若要点击手机的返回键,则可以放在onBackPressed()中

  1. 在Activity1中重写onActivityResult函数,来获取回传过来的值

    /**
     *
     * @param requestCode   请求吗
     * @param resultCode    返回数据中传入的处理结果(一般为RESULT_OK、RESULT_CANCELED)
     * @param data           携带着返回数据的Intent
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode){
            case 1:
                if(resultCode == RESULT_OK){
                    String returnedData = data.getStringExtra("data_return");
                    Log.e("111",returnedData);
                    Toast.makeText(MainActivity.this,returnedData,Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }
    

三、活动的生命周期

在这里插入图片描述

4种活动状态:运行状态、暂停状态、停止状态、销毁状态
暂停和停止的区别:停止为完全不可见,若启动的新活动是一个对话框式的活动,则为暂停状态。
系统回收概率为4种状态的倒序

若担心停止状态的活动被系统误回收,则可以重写onSaveInstanceState(),如

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    String name = "...";
    outState.putString("name",name);
}

同时在onCreate方法中获取到

if(savedInstanceState != null){
	String name = savedInstanceState.getString("name");
}

四、Activity的小技巧

1. 知晓当前运行的是在哪个活动

可以用getClass().getSimpleName());

2.创建活动管理器 可以方便管理,方便直接退出程序

    public class ActivityCollector {
    
        public 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() {
            for (Activity activity : activities) {
                if (!activity.isFinishing()) {
                    activity.finish();
                }
            }
            activities.clear();
        }
    
        public static void exitApp(){
            finishAll();
            android.os.Process.killProcess(android.os.Process.myPid());
        }  	 }

为了方便每个Activity的管理,可以写入BaseActivity中

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

3. 启动活动的最佳写法

    	public static void actionStart(Context context, String data1, String data2){
        Intent intent=new Intent(context,Main2Activity.class);
        intent.putExtra("param1",data1);
        intent.putExtra("param2",data2);
   	 }

猜你喜欢

转载自blog.csdn.net/qq_39830579/article/details/86616623