Android - 活动(Activity), 服务(Service), 广播(Broadcast), 广播接收器(BroadcastReceiver)
介绍
在 Android 中使用 Activity, Service, Broadcast, BroadcastReceiver
活动(Activity) - 用于表现功能
服务(Service) - 相当于后台运行的 Activity
广播(Broadcast) - 用于发送广播
广播接收器(BroadcastReceiver) - 用于接收广播
Intent - 用于连接以上各个组件,并在其间传递消息
1、演示 Activity 的基本用法,一个 Activity 启动另一个 Activity,启动另一个 Activity 时为其传递参数,被启动的 Activity 返回参数给启动者的 Activity
- Main.java
-
- 代码
- package
com.webabcd.activity; -
- import
android.app.Activity; - import
android.content.Intent; - import
android.os.Bundle; - import
android.util.Log; - import
android.view.View; - import
android.widget.Button; - import
android.widget.TextView; -
- public
class Main extends Activity { -
-
TextView txt; -
-
-
@Override -
public void onCreate(Bundle savedInstanceState) { -
super.onCreate(savedInstanceState); -
this.setContentView(R.layout.main); -
-
txt = (TextView) this.findViewById(R.id.txt); -
txt.setText("Activity 1"); -
-
Button btn = (Button) this.findViewById(R.id.btn); -
btn.setText("启动另一个Activity"); -
btn.setOnClickListener(new Button.OnClickListener() { -
@Override -
public void onClick(View v) { -
-
// 实例化 Intent,指定需要启动的 Activity -
Intent intent = new Intent(); -
intent.setClass(Main.this, MyActivity.class); -
-
// 实例化 Bundle,设置需要传递的参数 -
Bundle bundle = new Bundle(); -
bundle.putString("name", "webabcd"); -
bundle.putDouble("salary", 100.13); -
-
// 将需要传递的参数赋值给 Intent 对象 -
intent.putExtras(bundle); -
-
// startActivity(intent); // 启动指定的 Intent(不等待返回结果) -
// Main.this.finish(); -
-
// 启动指定的 Intent,并等待返回结果 -
// 其中第二个参数如果大于等于零,则返回结果时会回调 onActivityResult() 方法 -
startActivityForResult(intent, 0); -
} -
}); -
-
Log.d("MyDebug", "onCreate"); -
} -
-
// 被启动的 Activity 返回结果时的回调函数 -
@Override -
protected void onActivityResult(int requestCode, int resultCode, Intent data) { -
if (resultCode == Activity.RESULT_OK){ -
Bundle bundle = data.getExtras(); -
-
String name = bundle.getString("name"); -
double salary = bundle.getDouble("salary"); -
-
txt.setText("Activity 1" + "\n名字:" + name + "\n薪水:" + String.valueOf(salary)); -
} -
} -
-
@Override -
protected void onStart() { -
// TODO Auto-generated method stub -
super.onStart(); -
-
Log.d("MyDebug", "onStart"); -
} -
-
@Override -
protected void onStop() { -
// TODO Auto-generated method stub -
super.onStop(); -
-
Log.d("MyDebug", "onStop"); -
} -
-
@Override -
protected void onRestart() { -
// TODO Auto-generated method stub -
super.onRestart(); -
-
Log.d("MyDebug", "onRestart"); -
} -
-
@Override -
protected void onPause() { -
// TODO Auto-generated method stub -
super.onPause(); -
-
Log.d("MyDebug", "onPause"); -
} -
-
@Override -
protected void onResume() { -
// TODO Auto-generated method stub -
super.onResume(); -
-
Log.d("MyDebug", "onResume"); -
} -
-
@Override -
protected void onDestroy() { -
// TODO Auto-generated method stub -
super.onDestroy(); -
-
Log.d("MyDebug", "onDestroy"); -
} - }
-
- MyActivity.java
-
- 代码
- package
com.webabcd.activity; -
- import
android.app.Activity; - import
android.content.Intent; - import
android.os.Bundle; - import
android.view.View; - import
android.widget.Button; - import
android.widget.TextView; -
- //
被另一个 Activity 所启动的 Activity - public
class MyActivity extends Activity { -
-
Intent intent; -
-
-
@Override -
public void onCreate(Bundle savedInstanceState) { -
super.onCreate(savedInstanceState); -
this.setContentView(R.layout.main2); -
-
// 获取启动者传递过来的参数 -
intent = this.getIntent(); -
Bundle bundle = intent.getExtras(); -
String name = bundle.getString("name"); -
double salary = bundle.getDouble("salary"); -
-
TextView txt = (TextView) this.findViewById(R.id.txt); -
txt.setText("Activity 2" + "\n名字:" + name + "\n薪水:" + String.valueOf(salary)); -
-
Button btn = (Button) this.findViewById(R.id.btn); -
btn.setText("返回前一个Activity"); -
btn.setOnClickListener(new Button.OnClickListener() { -
public void onClick(View v) { -
// 返回参数给启动者 -
MyActivity.this.setResult(Activity.RESULT_OK, intent); -
MyActivity.this.finish(); -
} -
}); -
} - }
-
-
- AndroidManifest.xml
-
- 代码
- <?xml
version="1.0" encoding="utf-8"?> - <manifest
xmlns:android="http://schemas.android.com/apk/res/android" -
package="com.webabcd.activity" android:versionCode="1" -
android:versionName="1.0"> -
<application android:icon="@drawable/icon" android:label="@string/app_name"> -
<activity android:name=".Main" 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 ,则都要在这里做相应的配置 -
--> -
<activity android:name=".MyActivity" android:label="Activity 2" /> -
</application> -
<uses-sdk android:minSdkVersion="3" /> - </manifest>
-
-
- 2、Service,
Broadcast, BroadcastReceiver 的演示 - Main.java
-
- 代码
- package
com.webabcd.service; -
- import
android.app.Activity; - import
android.content.BroadcastReceiver; - import
android.content.ComponentName; - import
android.content.Context; - import
android.content.Intent; - import
android.content.IntentFilter; - import
android.content.ServiceConnection; - import
android.os.Bundle; - import
android.os.IBinder; - import
android.view.View; - import
android.view.View.OnClickListener; - import
android.widget.TextView; -
-
- public
class Main extends Activity implements OnClickListener { -
-
private TextView txtMsg; -
-
@Override -
public void onCreate(Bundle savedInstanceState) { -
super.onCreate(savedInstanceState); -
setContentView(R.layout.main); -
-
setTitle("android 之 service"); -
-
this.findViewById(R.id.btnStart).setOnClickListener(this); -
this.findViewById(R.id.btnStop).setOnClickListener(this); -
this.findViewById(R.id.btnBind).setOnClickListener(this); -
this.findViewById(R.id.btnUnbind).setOnClickListener(this); -
-
txtMsg = (TextView)this.findViewById(R.id.txtMsg); -
-
// 实例化自定义的 BroadcastReceiver -
receiver = new UpdateReceiver(); -
IntentFilter filter = new IntentFilter(); -
// 为 BroadcastReceiver 指定 action ,使之用于接收同 action 的广播 -
filter.addAction("com.webabcd.service.msg"); -
-
// 以编程方式注册 BroadcastReceiver 。配置方式注册 BroadcastReceiver 的例子见 AndroidManifest.xml 文件 -
// 一般在 OnStart 时注册,在 OnStop 时取消注册 -
this.registerReceiver(receiver, filter); -
// this.unregisterReceiver(receiver); -
-
} -
-
@Override -
public void onClick(View v) { -
Intent intent = new Intent(Main.this, MyService.class); -
switch (v.getId()) { -
case R.id.btnStart: -
this.startService(intent); -
break; -
case R.id.btnStop: -
this.stopService(intent); -
break; -
case R.id.btnBind: -
this.bindService(intent, conn, Context.BIND_AUTO_CREATE); -
break; -
case R.id.btnUnbind: -
this.unbindService(conn); -
break; -
} -
} -
-
// bindService() 所需的 ServiceConnection 对象 -
private ServiceConnection conn = new ServiceConnection() { -
@Override -
public void onServiceConnected(ComponentName className, IBinder service) { -
-
} -
@Override -
public void onServiceDisconnected(ComponentName className) { -
-
} -
}; -
-
private String msg=""; -
private UpdateReceiver receiver; -
// 实现一个 BroadcastReceiver,用于接收指定的 Broadcast -
public class UpdateReceiver extends BroadcastReceiver{ -
-
@Override -
public void onReceive(Context context, Intent intent) { -
msg = intent.getStringExtra("msg"); -
-
txtMsg.append(msg + "\n"); -
} -
-
} - }
-
- MyService.java
-
- 代码
- package
com.webabcd.service; -
- import
android.app.Service; - import
android.content.Intent; - import
android.os.IBinder; - import
android.util.Log; -
- //
演示 Service 的生命周期。具体信息运行程序后在 LogCat 中查看 - public
class MyService extends Service { -
-
@Override -
public IBinder onBind(Intent intent) { -
-
Log.d("MyDebug", "onBind"); -
sendMsg("onBind"); -
-
// TODO Auto-generated method stub -
return null; -
} -
-
@Override -
public void onCreate() { -
// TODO Auto-generated method stub -
super.onCreate(); -
-
Log.d("MyDebug", "onCreate"); -
sendMsg("onCreate"); -
} -
-
@Override -
public void onDestroy() { -
// TODO Auto-generated method stub -
super.onDestroy(); -
-
Log.d("MyDebug", "onDestroy"); -
sendMsg("onDestroy"); -
} -
-
@Override -
public void onRebind(Intent intent) { -
// TODO Auto-generated method stub -
super.onRebind(intent); -
-
Log.d("MyDebug", "onRebind"); -
sendMsg("onRebind"); -
} -
-
@Override -
public void onStart(Intent intent, int startId) { -
super.onStart(intent, startId); -
-
Log.d("MyDebug", "onStart"); -
sendMsg("onStart"); -
} -
-
@Override -
public boolean onUnbind(Intent intent) { -
-
Log.d("MyDebug", "onUnbind"); -
sendMsg("onUnbind"); -
-
// TODO Auto-generated method stub -
return super.onUnbind(intent); -
} -
-
// 发送广播信息 -
private void sendMsg(String msg){ -
// 指定广播目标的 action (注:指定了此 action 的 receiver 会接收此广播) -
Intent intent = new Intent("com.webabcd.service.msg"); -
// 需要传递的参数 -
intent.putExtra("msg", msg); -
// 发送广播 -
this.sendBroadcast(intent); -
} - }
-
-
- MyBootReceiver.java
-
- 代码
- package
com.webabcd.service; -
- import
android.content.BroadcastReceiver; - import
android.content.Context; - import
android.content.Intent; - import
android.util.Log; -
- public
class MyBootReceiver extends BroadcastReceiver { -
-
// 用于接收满足条件的 Broadcast(相应的 Broadcast 的注册信息详见 AndroidManifest.xml ,当系统启动完毕后会调用这个广播接收器) -
@Override -
public void onReceive(Context arg0, Intent arg1) { -
Log.d("MyDebug", "onReceive"); -
-
// 启动服务 -
Intent service = new Intent(arg0, MyService.class); -
arg0.startService(service); -
} -
- }
-
-
- AndroidManifest.xml
-
- 代码
- <?xml
version="1.0" encoding="utf-8"?> - <manifest
xmlns:android="http://schemas.android.com/apk/res/android" -
package="com.webabcd.service" android:versionCode="1" -
android:versionName="1.0"> -
<application android:icon="@drawable/icon" android:label="@string/app_name"> -
<activity android:name=".Main" android:label="@string/app_name"> -
<intent-filter> -
<action android:name="android.intent.action.MAIN" /> -
<category android:name="android.intent.category.LAUNCHER" /> -
</intent-filter> -
</activity> -
-
<!-- -
如果有需要用到的 service ,则都要在这里做相应的配置 -
--> -
<service android:name=".MyService"></service> -
-
<!-- -
注册一个 BroadcastReceiver -
其 intent-filter 为 android.intent.action.BOOT_COMPLETED(用于接收系统启动完毕的 Broadcast) -
--> -
<receiver android:name=".MyBootReceiver"> -
<intent-filter> -
<action android:name="android.intent.action.BOOT_COMPLETED" /> -
</intent-filter> -
</receiver> -
</application> -
-
<!-- -
接受系统启动完毕的 Broadcast 的权限 -
--> -
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> -
<uses-sdk android:minSdkVersion="3" /> - </manifest>
-