全部博文(153)
分类: LINUX
2010-12-17 09:55:14
一、创建新的Activity
在进行桌面开发时,我们可以通过一个窗口上的控件事件打开另一个新的窗口。在WEB应用开发时,我们也可以通过一个连接打开一个新的页面。通过添加新的 窗口开完善或增强软件的功能,那么在Android应用开发 中,我们应该怎样打开新的Activity?
1.添加新的Activity(创建Android工 程:MainActivity)
1).新建一个继承自Activity类 的类NewActivity
package com.changcheng.activity;
import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button;
public class NewActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.new_activity); // 获取 按钮并未按钮添加事件 Button button = (Button) this.findViewById(R.id.newa_bt_close); button.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) { NewActivity.this.finish(); } }); }
} |
2).AndroidManifest.xml文件中添加
xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="" package="com.changcheng.activity" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> intent-filter> activity>
<activity android:name=".NewActivity" android:label="@string/new_activity" /> application> <uses-sdk android:minSdkVersion="7" /> manifest> |
3).newactivity.xml
xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/newa_activity" />
<Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/newa_bt_close" android:id="@+id/newa_bt_close" /> LinearLayout> |
4).strings.xml
xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, MainActivity!string> <string name="app_name">创建新的Activitystring> <string name="bt_open_new_activity">打开新的Activitystring> <string name="new_activity">新的Activitystring> <string name="newa_activity">新的Activitystring> <string name="newa_bt_close">关闭string> resources> |
5).MainActivity.java
package com.changcheng.activity;
import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button;
public class MainActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 获取 按钮,并为按钮添加单击的事件 Button button = (Button) this.findViewById(R.id.bte_open_new_activity); button.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) { // 创建 显式意图 Intent intent = new Intent(MainActivity.this, NewActivity.class); // 打开 新的Activity startActivity(intent); } });
} } |
二、Activity之间传递参数
在桌面程序中窗口之间,我们可以通过构造参数或全局变量来传递数据。在WEB应用中,我们可以通过域 (request\response\session...)在页面之间传递数据。那如何在Android的Activity之间传递参数呢?
通过intent.putExtra方法为意图添加参数,打开新的Activity后可以通过 this.getIntent().getStringExtra()等方法获取参数。
三、请求码与结果码
在上面的程序中我们通过 startActivity(intent)打开一个新的Activity,Android为了减少组件间的耦合,所以使用了Intent(Intent 在下面会有介绍)。所以我们在onClick事件打开的新Activity不与主Activity在一个线程中。但是,当新Activity被关闭后,会 触发主Activity的onActivityResult事件。
1.请求码
在一个业务中可能在两个按钮被单击事件中打开同一个Activity,但我们在onActivityResult事件中如何判断是哪个按钮打开了新的 Activity?请求码就是为解决这个问题的,那么我们打开新的Activity时应该使用 startActivityForResult(intent, 1);。其中的第二个参数就是请求码。
onActivityResult事件:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); } |
在onactivityResult事 件中,通过判断requestCode更可知道被关闭Activity是通过哪个位置打开的。
2.结果码
在一个业务中可能要打开多个不同的Activity, 那关闭Activity时在onactivityResult事件中我们如何知道关闭的是哪一个Activity呢?结果码就是为解决这个问题的,那么我们打开新的Activity时应该使用setResult(2, intent);或在关闭Activity前调用ActivityObj.setResult(2);。其中的第一个参数就是结果码。
在onactivityResult事件中,通过判断resultCode更可知道是哪个Activity被关闭了。
三、Intent意图
Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行动作和产生事件。使用Intent可以激活 Android应用的三个核心组件:活动、服务和广播接收器。
Intent可以划分成显式意图和隐式意图:
1).显式意图:调用Intent.setComponent()或Intent.setClass()方法指定了组件名或类对象的Intent为显式意 图,显式意图明确指定了Intent应该传递给哪个组件。比如我们上边的打开新的Activity程序。
2).隐式意图:没有调用Intent.setComponent()或Intent.setClass()方法指定组件名或类对象的Intent为隐式 意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。通过隐式意图打开新的Activity:
AndroidManifest.xml:
<activity android:name=".NewActivity" android:label="@string/new_activity"> <intent-filter> <action android:name="com.changcheng.activity.NewActivity"/> <category android:name="android.intent.category.DEFAULT" /> intent-filter> activity> |
MainActivity:
@Override public void onClick(View v) { // 创建显式意图 Intent intent = new Intent("com.changcheng.activity.NewActivity"); //Intent intent = new Intent(MainActivity.this, NewActivity.class); // 打开新的Activity startActivity(intent);// 发送Intent时,意图里相当于有一个类别:android.intent.category.DEFAULT } |
在intent过滤器中还 可以添加多个action和category,还可以添加data。具体使用在此就不做总结了,可以查看相关资料或帮助文档。
3).显式意图与隐式意图的应用场景:
在项目内部建议使用显式意图。
在应用与应用之间只能使用隐式意图。
四、Activity的生命周期
Activity有三个状态:
当它在屏幕前台时(位于当前任务堆栈的顶部),它是激活或 运行状态。它就是响应用户操作的Activity。
当它失去焦点但仍然对用户可见时,它处于暂停状态。即在它 之上有另外一个Activity。这个Activity也许是透明的,或者没有完全覆盖全屏,所以被暂停的Activity仍对用户可见。暂停的Activity仍然是存活状态(它保留着所有的状态和成员信息并保持和窗 口管理器的连接),但系统处于极低内存时仍然可以杀死这个Activity。
完全被另一个Activity覆盖时则处于停止状态。它仍然保留所有的状态和成员信息。 然而对用户是不可见的,所以它的窗口将被隐藏,如果其它地方需要内存,则系统经常会杀死这个Activity。
当Activity从一种状态转变到另一种状态时,会调用以下保护方法来通知这种变化:
void onCreate(Bundle savedInstanceState)
void onStart()
void onRestart()
void onResume()
void onPause()
void onStop()
void onDestroy()
这七个事件定义了Activity的完整生命周期。实现这些事件方法可以帮助我们监视其中的
三个嵌套生命周期循环:
1).Activity的完整生命周期自第一次调用onCreate()开始,直至调用onDestroy()为止。Activity在onCreate()中设置所有“全 局”状态以完成初始化,而在onDestroy()中释放所有系统资源。例如,如果Activity有一个线程在后台运行从网络上 下载数据,它会在onCreate()创建线程,而在 onDestroy()销毁线程。
2).Activity的可视生命周期自onStart()调用开始直到相应的onStop()调用结束。在此期间,用户可以在屏幕上看到Activity,尽管它也许并不是位于前台或者也不与用户进行交互。在这 两个方法之间,我们可以保留用来向用户显示这个Activity所 需的资源。例如,当用户不再看 见我们显示的内容时,我们可以在onStart()中注册一个BroadcastReceiver来监控会影响UI的变化,而在onStop()中来注 消。onStart() 和 onStop() 方法可以随着应用程序是否为用户可见而被多次调用。
3).Activity的前台生命周期自onResume()调用起,至相应的onPause()调用为止。在此期间,Activity位于前台最上面并 与用户进行交互。Activity会经常在暂停和恢复之间进行状态转换——例如当设备转入休眠状态或者有新的Activity启动时,将调用 onPause() 方法。当Activity获得结果或者接收到新的Intent时会调用onResume() 方法。关于前台生命周期循环的例子请见PPT下方备注栏。
五、广播接收者
广播接收者(BroadcastReceiver)用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()来实现的。 通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收,广播接收者和JMS中的Topic消息接收者很相似。要实现一个广播接收者方法如下:
1).继承BroadcastReceiver,并重写onReceive()方法。
2).订阅感兴趣的广播Intent,订阅方法有两种:
· 使用代码进行订阅:
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomingSMSReceiver();
registerReceiver(receiver, filter);
· 在AndroidManifest.xml文件中的
通常一个BroadcastReceiver对象的生命周期不超过5秒,所以在BroadcastReceiver里 不能做一些比较耗时的操作,如果需要完成一项比较耗时的工作,可以通过发送Intent给Activity或Service,由Activity或Service来完成。
六、服务
Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用 它开发如监控之类的程序。服务的开发比较简单,如下:
1.继承Service类
public class SMSService extends Service { }
2.在AndroidManifest.xml文件中的
服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可 以启动Service,但是它们的使用场合有所不同。使用startService()方法启用服务,调用者与服务之间没有关连, 即使调用者退出了,服务仍然运行。使用bindService()方 法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。
如果打算采用Context.startService()方法启动服务,在服务未被创 建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调 用onStart()方法。采用startService()方法启动的服务,只能调 用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。
如果打算采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用 onBind()方法。这个时 候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方 法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑 定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如 果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的 onUnbind()-->onDestroy()方法。
http://www.blogjava.net/changcheng/archive/2010/03/07/314737.html
chinaunix网友2010-12-17 15:11:42
很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com