服务(android.app.Service)是Android系统中一个重点, 服务主要用于两个目的: 后台运行和跨进程访问. 例如从Internet 下载文件、 音乐播放器
在Android系统中,利用BroadcastReceiver 接收广播可以 启动一个Activity, 同样可以启动Service
一个示例,在StartupReceiver 类的onReceive() 方法中完成了两项工作:启动服务和显示一个Activity 来提示服务启动成功. 其中MessageActivity 类在配置时使用了"@android:style/Theme.Dialog" 主题. 因此,如果服务启动成功,将显示图片
关键代码如下:
public class StartupReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent serviceIntent = new Intent(context, MyService.class);
context.startService(serviceIntent); //同上下文启动服务
Intent activityIntent = new Intent(context, MessageActivity.class);
activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(activityIntent);
}
}
示意图如下
AndroidManifest.xml配置,包括对Activtiy,BroadcastReceiver,Service,uses-permission 4种类型的配置
再看一个示例,来电黑名单设置: 通过系统服务获得电话服务Telephony 对象,监听手机的来电状态,将用户设定号码来电高成静音,这样还需要一个音频服务AudioManager 对象
主要代码如下:
public class Main extends Activity {
public class MyPhoneCallListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
;
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
break;
case TelephonyManager.CALL_STATE_RINGING:
if ("5556".equals(incomingNumber)) {
audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
}
break;
}
super.onCallStateChanged(state, incomingNumber);
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
MyPhoneCallListener myPhoneCallListener = new MyPhoneCallListener();
tm.listen(myPhoneCallListener, PhoneStateListener.LISTEN_CALL_STATE);
}
}
具体代码 请参见 ch08_phoneblacklist工程