边做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。
- 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);
* 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
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也就这么点。一下子全看了也记不了,倒不如用到的时候再看。下一次就说说布局吧,毕竟先搭出来个页面有一些成就感=。=