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

<a href="http://www.jianshu.com/p/866e5b20c02d">边做iOS边学Android(一):新建一个project</a>
<a href="http://www.jianshu.com/p/94d806401ceb">边做iOS边学Android(二):认识几个常用的控件</a>
趁着不忙赶紧多写点,鬼知道后面又有什么需求要忙...

这次就看一下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嘛)。
<activity android:name=".NormalActivity">
* 2.3 在NormalActivity的onCreate里添加setContentView(R.layout. normal_layout);
* 2.4 我们是从mainActivity跳到NormalActivity里,所以在main上加个按钮(<a href="http://www.jianshu.com/p/94d806401ceb">第二回里面有说咋加</a> )。点击事件什么的也都写好,然后在点击事件里:
  • 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有个<intent-filter>,隐式创建也要用到这个,就是在manifest里对应的Activity标签内部加一个筛选。<intent-filter>里边可以有3种标签<action>、<category>、<data>。

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. 谷歌爹说的)

<activity android:name=".NormalActivity">
             <intent-filter>
                <action android:name="start_a_handsome_activity"/>       
               <category android:name="android.intent.category.DEFAULT"/>
              </intent-filter>
</activity>

回到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);
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

three_on_activity_result.png

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

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容