边做iOS边学Android(三):Activity生命周期+通信

边做iOS边学Android(一):新建一个project
边做iOS边学Android(二):认识几个常用的控件
趁着不忙赶紧多写点,鬼知道后面又有什么需求要忙...

这次就看一下Activity的生命周期,以及不同Activity之间的通信吧。
开始:

  • 1 新建一个项目,ActivityLifeCyclePractice。然后在MainActivity里添加一些生命周期的方法,Activity的生命周期方法有onCreate、onStart、onRestart、onResume、onPause、onStop、onDestroy。
    • 1.1 创建时:onCreate(viewDidLoad)、onStart(viewWillAppear?)、onResume(viewDidAppear?),在onResume时是前台可交互状态。
    • 1.2 进入后台,调用onPause:Activity不在栈顶,但是栈顶的Activity半透明或者不覆盖全屏;onStop:不在栈顶,被完全覆盖,成员信息保留,不执行代码。
    • 1.3 从后台进入前台,调用onRestart、onStart、onResume。
    • 1.4 应用销毁,调用onPause、onStop、onDestroy。
public static final String TAG = "MainActivity";
@Override   
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG,"onCreate");
    }        
@Override    
protected void onRestart(){
        super.onRestart(); 
        Log.d(TAG,"onRestart");
    }        
@Override    
protected void onStart(){
        super.onStart();
        Log.d(TAG,"onStart");
    }    
@Override    
protected void onResume(){
        super.onResume();
        Log.d(TAG,"onResume");
    }    
@Override    
protected void onPause(){
        super.onPause();
        Log.d(TAG,"onPause");
    }    
@Override    
protected void onStop(){
        super.onStop();
        Log.d(TAG,"onStop");
    }    
@Override    
protected void onDestroy(){
        super.onDestroy();
        Log.d(TAG,"onDestroy");
    }

Log.d就是打印debug级别的日志,.d可以改,看日志等级了。2个参数,第一个是筛选用的字符串,后面的就是打印的内容。在底部有个logcat,展开以后就是这样。跑起来,模拟器底下的back按钮会销毁当前的Activity。


three_Log.jpeg

  • 2 接下来看一下Activity之间的传值
    • 2.1 再创建一个NormalActivity,在layout下新建一个normal_layout,layout里新加一个TextView,代码就不贴了。
    • 2.2 在manifest里注册这个Activity,之前老忘。不用多想,跟main的Activity同级的啦(都是Activity嘛)。

* 2.3 在NormalActivity的onCreate里添加setContentView(R.layout. normal_layout);
* 2.4 我们是从mainActivity跳到NormalActivity里,所以在main上加个按钮(第二回里面有说咋加 )。点击事件什么的也都写好,然后在点击事件里:
  • 3 使用Intent启动、传值
    • 3.1 Intent是一个好东西。它可以启动Activity,启动Service,启动Broadcast。(中间一个不知道干嘛的,总会知道的,第三个就是通知嘛...)
    • 3.2 使用Intent启动Activity,可以分为显示跟隐式创建,显式的简单些:
      • 3.2.1 喏,就是下面这样,在按钮的点击里加上就可以跳过去了。之所以说是显式是因为目标活动很明显摆在那了。
Intent intent = new Intent(当前Activity.this, 目标Activity.class);
startActivity(intent);
    * 3.2.2 隐式就麻烦一些,第一篇里边说过我们的main的Activity有个,隐式创建也要用到这个,就是在manifest里对应的Activity标签内部加一个筛选。里边可以有3种标签

action只能有一个,category可以有多个。action的name自己定,category就是这个值了(没深究,没有category会,Therefore, activities that are willing to receive implicit intents must include "android.intent.category.DEFAULT" in their intent filters. 谷歌爹说的)


             
                       
               
              

回到MainActivity里按钮的点击里把刚才显示的换掉

Intent intent = new Intent("start_a_handsome_activity");
startActivity(intent);
* 3.3使用Intent传值,传个字符串过去,就是这样
intent.putExtra("key","劳资传过来的值");
* 3.4 在NormalActivity里(刚才有创见过TextView),显示一下传过来的值
Intent intent = getIntent();
String text = intent.getStringExtra("key");
TextView textView = (TextView) findViewById(R.id.normal_textView);
textView.setText(text);
边做iOS边学Android(三):Activity生命周期+通信_第1张图片
three_intent_put.png
* 3.5 在第二个活动里把值传回上一个(底下的back按钮),因为这个时候第二个会被销毁,所以:
    * 3.5.1 这个时候就不能用startActivity()方法启动活动了,要用
startActivityForResult(intent,10086);

第一个是intent,第二个是requestCode,一个int值,唯一就行。
然后在NormalActivity里加一个按钮,里边给intent赋值,然后调用setResult把intent传回去,有2个参数,第一个是resultCode,一般就选2个值RESULT_OK或RESULT_CANCLED。然后调用finish()销毁NormalActivity

Button btn = (Button) findViewById(R.id.destroy_button);
btn.setOnClickListener(new View.OnClickListener() {
              @Override    
              public void onClick(View v) {
                  Intent intent = getIntent();
                  intent.putExtra("second","这是从Normal里传过来的");
                  setResult(RESULT_OK,intent);
                  finish();
              }
});

然后第一个MainActivity里会走回调

@Override
protected void onActivityResult(int requestCode, int resultCode,Intent data){
             switch (requestCode){
               case 10086:
                    if (resultCode == RESULT_OK){
                        String text = data.getStringExtra("second");
                        Toast.makeText(MainActivity.this,text,Toast.LENGTH_SHORT).show();
                    }
               break;
              default:
              }
}

不写在onDestory里是因为第一个Activity的回调先走,再走onDestory,这样resultCode就一直是RESULT_CANCLED

边做iOS边学Android(三):Activity生命周期+通信_第2张图片
three_on_activity_result.png

intent作为初学者还是得好好看看,
里的可以用来指定可以响应的数据类型,例:

Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse(“http://www.baidu.com”));
        startActivity(intent)

这是打开一个网页,Intent.ACTION_VIEW是系统内置的,setData方法传一个Uri对象,标签可以筛选:
android: scheme(http部分)/host(www.baidu.com部分)/port/path/mimeType。

我知道的Intent也就这么点。一下子全看了也记不了,倒不如用到的时候再看。下一次就说说布局吧,毕竟先搭出来个页面有一些成就感=。=

你可能感兴趣的:(边做iOS边学Android(三):Activity生命周期+通信)