HardBirch

Android提高第四篇之Activity+Intent

时间:10-11-06 栏目:安卓入门与提高 作者:张飞不张,文采横飞 评论:18 点击: 8,277 次

      Android有三个基础组件Activity,Service和BroadcastReceiver,他们都是依赖Intent来启动。本文介绍的是Activity的生命周期以及针对Activity的Intent使用。

      之前的例子一直都是使用Activity,在一个Layout XML与一个Activity捆绑的情况下可以视为一个Form,多个Layout XML与一个Activity捆绑的话那就是个Application本身了。Intent可以分为显式Intent和隐式Intent:显式Intent用于启动明确的目标组件(前面所说的三大组件),同一个Application内的多个Activity调用也是显式Intent;隐式Intent就是调用没有明确的目标组件,可以是系统也可以是第三方程序。隐式Intent一般用于调用系统组件功能,相关例程都是网络上很容易找到的(调用某些系统组件的时候要申请权限)。

        Acitivity的运行状况分为:onCreate、onDestroy、onStart、onStop、onRestart、onResume、onPause,onCreate对应onDestroy,onStart对应onStop,onResume对应onPause。

先贴出本文运行截图:

这个是从Acitivity1转到Activity2的时候,Acitivity1的状态变化,使用了finish()会触发onDestroy()。

这个是从Activity2转到Activity1的时候,Acitivity2的状态变化。从两次Activity的启动可以看出,流程是onCreate()->onStart()->onResume()三个方法,销毁是onPause()->onStop()->onDestroy()。另外,要往工程添加第二个Activity,需要到AndroidManifest.xml->Application那里添加Activity2。

main1.xml的源码:














main2.xml的源码:









Activity1的源码:




















btnToInternalActivity=(Button)this.findViewById(R.id.main1_Button01);
btnToExternalActivity=(Button)this.findViewById(R.id.main1_Button02);
btnToInternalActivity.setOnClickListener(new ClickEvent());
btnToExternalActivity.setOnClickListener(new ClickEvent());
tbBundle=(EditText)this.findViewById(R.id.EditText01);
}
public void onDestroy()
{
super.onDestroy();
Log.e("Activity1", "onDestroy");//显示当前状态,onCreate与onDestroy对应
}
@Override
public void onStart()
{
super.onStart();
Log.e("Activity1", "onStart");//显示当前状态,onStart与onStop对应
}
@Override
public void onStop()
{
super.onStop();
Log.e("Activity1", "onStop");//显示当前状态,onStart与onStop对应
}
@Override
public void onRestart()
{
super.onRestart();
Log.e("Activity1", "onRestart");
}
@Override
public void onResume()
{
super.onResume();
Log.e("Activity1", "onResume");//显示当前状态,onPause与onResume对应
SharedPreferences prefs = getPreferences(0); //SharedPreferences 用于存储数据
String restoredText = prefs.getString("editText01", null);
if (restoredText != null) {
this.tbBundle.setText(restoredText);
}
}
@Override
public void onPause()
{
super.onResume();
Log.e("Activity1", "onPause");//显示当前状态,onPause与onResume对应
//保存文本框的内容,使得重回本Acitivity的时候可以恢复
SharedPreferences.Editor editor = getPreferences(0).edit();//SharedPreferences 用于存储数据
editor.putString("editText01", this.tbBundle.getText().toString());
editor.commit();
}

class ClickEvent implements View.OnClickListener{
@Override
public void onClick(View v) {
if(v==btnToInternalActivity)
{
Intent intent = new Intent();
intent.setClass(testActivityIntent.this,Activity2.class);

//new一个Bundle对象,并将要传递的数据传入
Bundle bundle = new Bundle();
bundle.putString("Text",tbBundle.getText().toString());

//将Bundle对象assign给Intent
intent.putExtras(bundle);

//调用Activity2
startActivity(intent);

testActivityIntent.this.finish();//会触发onDestroy();
}
else if(v==btnToExternalActivity)
{
//有些外部调用需要开启权限
Uri uri = Uri.parse("http://google.com");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
}

}

}

}

Activity2的源码:













//加载activity2.xml
setContentView(R.layout.main2);

//得Intent中的Bundle对象
Bundle bunde = this.getIntent().getExtras();
//取得Bundle对象中的数据
Log.i("In_Text", bunde.getString("Text"));
btnBackMain1=(Button)this.findViewById(R.id.main2_Button01);
btnBackMain1.setOnClickListener(new ClickEvent());
}

public void onDestroy()
{
super.onDestroy();
Log.e("Activity2", "onDestroy");//显示当前状态,onCreate与onDestroy对应
}
@Override
public void onStart()
{
super.onStart();
Log.e("Activity2", "onStart");//显示当前状态,onStart与onStop对应
}
@Override
public void onStop()
{
super.onStop();
Log.e("Activity2", "onStop");//显示当前状态,onStart与onStop对应
}
@Override
public void onRestart()
{
super.onRestart();
Log.e("Activity2", "onRestart");
}
@Override
public void onResume()
{
super.onResume();
Log.e("Activity2", "onResume");//显示当前状态,onPause与onResume对应
}
@Override
public void onPause()
{
super.onResume();
Log.e("Activity2", "onPause");//显示当前状态,onPause与onResume对应
}

class ClickEvent implements View.OnClickListener{
@Override
public void onClick(View v) {
if(v==btnBackMain1)
{

Intent intent = new Intent();
intent.setClass(Activity2.this,testActivityIntent.class);

//调用Activity1
startActivity(intent);

Activity2.this.finish();//会触发onDestroy();
}

}

}
}

声明: 本文由( 张飞不张,文采横飞 )原创编译,转载请保留链接: Android提高第四篇之Activity+Intent

Android提高第四篇之Activity+Intent:目前有18 条留言

  1. 18楼
    javacn_org:

    activity的基本知识
    activity的生命周期和传值!谢谢分享

    2010-11-07 12:24 [回复]
  2. 17楼
    snail82:

    太棒了,做的很细[e01]

    2010-11-08 18:22 [回复]
  3. 16楼
    raotf:

    厉害啊

    2010-11-09 12:51 [回复]
  4. 15楼
    steven_chan:

    2010-11-10 10:18 [回复]
  5. 14楼
    AndrewLiuShu:

    写的太好了

    2010-11-11 17:34 [回复]
  6. 13楼
    favory:

    [e01]干嘛非得用Bundle对象呢,直接:
    intent.putExtra("Text",tbBundle.getText().toString());
    String In_Text=intent.getStringExtra("Text");
    不是更简洁…

    2010-11-16 16:40 [回复]
  7. 12楼
    chenyongsuda:

    字体很赞[e01]

    2010-12-07 18:29 [回复]
  8. 11楼
    tenseason:

    要在AndroidManifest.xml 加上《activity android:name="Activity2"》《/activity》

    在《/application》之前 左右尖括号是敏感字,用中文的左右尖括号

    2010-12-09 16:47 [回复]
  9. 10楼
    ljcrazy1:

    [e01]

    2011-03-25 17:10 [回复]
  10. 回复 favory:有时简单并不是最好的![e08]

    2011-05-13 15:33 [回复]
  11. 板大您好 我想請問一下,如果第二個頁面她是繼承 MapActivity
    而不是Activity,該如何使用Intent來轉換頁面? [e07]

    2011-05-21 16:37 [回复]
  12. [reply]favory[/reply]
    Intent提供了各种常用类型重载后的putExtra()方法,如: putExtra(String name, String value)、 putExtra(String name, long value),在putExtra()方法内部会判断当前Intent对象内部是否已经存在一个Bundle对象,如果不存在就会新建Bundle对象,以后调用putExtra()方法传入的值都会存放于该Bundle对象
    其实可以通过看源码,内部实现的原理都是一样的
    不过你的这种写法确实简洁一些。

    2011-10-19 14:26 [回复]
  13. 6楼
    hellogv:

    [reply]license2005[/reply]
    一样嘛

    2011-10-20 09:10 [回复]
  14. 在一个Layout XML与一个Activity捆绑的情况下可以视为一个Form,多个Layout XML与一个Activity捆绑的话那就是个Application本身了….您能帮我解释下这句话不!谢了

    2011-12-01 17:14 [回复]
  15. 4楼
    hellogv:

    [reply]nuc458sweet[/reply]
    如果你的app很小的话,只需要2~3个页面的话,可以这样理解,但如果是中等或者大工程的话,这样的开发维护成本居高,不能这样做。

    2011-12-02 13:28 [回复]
  16. 地板
    nuc458sweet:

    哦,谢谢!我知道您的意思了!

    2011-12-05 12:52 [回复]
  17. 板凳
    ypb09116:

    请问如何传递滑条移动产生的数据 int(progress)给另一个activity?
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)

    2012-03-18 09:31 [回复]
  18. 沙发
    hellogv:

    [reply]ypb09116[/reply]
    sendBroadcast()

    2012-03-18 14:16 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐