系出名门Android(4) - 活动(Activity), 服务(Service), 广播(Broadcast), 广播接收

器(BroadcastReceiver)

作者:webabcd

介绍
在 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;

/** Called when the activity is first created. */
@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;

/** Called when the activity is first created. */
@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;
/*
* startService() 和 bindService() 的区别
* startService() - 正常理解就好
* bindService() - 使当前上下文对象(本例中就是 Activity)通过⼀个 ServiceConnection 对象邦定
到指定的 Service 。这样,如果上下文对象销毁了的话,那么其对应的 Service 也会被销毁
*/
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>
OK
[源码下载]

更多相关文章

  1. Android实现系统重新启动
  2. Android常用的技术点
  3. ANDROID模拟器不能启动
  4. cocos2d-x3.0beta版+NDK-r9b在android上的启动过程
  5. Android隐式启动Activity匹配详解:Action,category,data
  6. Android启动优化
  7. android的四大组件及其生命周期
  8. 系出名门Android(4) - 活动(Activity), 服务(Service), 广播(Bro
  9. Android(安卓)ListView移动至指定行

随机推荐

  1. mysql中general_log日志知识点介绍
  2. MySQL中Multiple primary key defined报
  3. mysql第一次安装成功后初始化密码操作步
  4. macOS下mysql 8.0.16 安装配置图文教程
  5. mac系统下mysql 8.0.11 安装指南
  6. Mysql错误Every derived table must have
  7. windows下mysql 8.0.15 详细安装使用教程
  8. mysql定时删除过期数据记录的简单方法
  9. Mybatis mapper动态代理的原理解析
  10. MySQL下载安装详情图文教程