一个Demo学完Android中所有的服务
注:这个例子来自“安卓巴士”,经阅读,理解,写此文章
说明:这个例子实现了Android中常见的许多服务,下面是实现的截图
接下来,以源代码的方式分析这个例子
1.MainActivity--主界面
这个类主要是实现用户所看到的这个Activity,其中包含了一系列的按钮,用户点击按钮执行相应的动作,所以在这个类中主要是对按钮的定义和对按钮绑定相应的监听器,下面是实现的代码:
package lovefang.stadyService; import android.app.Activity; import android.os.Bundle; import android.widget.Button; import android.view.View; import android.content.Intent; import android.util.Log; /**这是使用后台服务的学习例子*/ public class MainStadyServics extends Activity { /**参数设置*/ Button startServiceButton;// 启动服务按钮 Button shutDownServiceButton;// 关闭服务按钮 Button startBindServiceButton;// 启动绑定服务按钮 Button sendBroadcast;// 使用广播 Button notificationButton;// 使用通知功能 Button alarmButton;// 使用闹钟 Button handlerButton;// 使用handler Button asyncButton;// 使用异步加载 Button phoneStateButton;// 查看手机状态 Button callphoneButton;// 拨打电话 Button vibratorButton;// 使用震动 CountService countService; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.v("MainStadyServics", "setContentView"); setContentView(R.layout.main); getWidget(); regiestListener(); } /**获得组件*/ public void getWidget(){ startServiceButton = (Button)findViewById(R.id.startServerButton); startBindServiceButton = (Button)findViewById(R.id.startBindServerButton); shutDownServiceButton = (Button)findViewById(R.id.sutdownServerButton); sendBroadcast = (Button)findViewById(R.id.sendBroadcast); notificationButton = (Button)findViewById(R.id.notification); alarmButton = (Button)findViewById(R.id.alarm); handlerButton = (Button)findViewById(R.id.handler); asyncButton = (Button)findViewById(R.id.async); phoneStateButton = (Button) findViewById(R.id.phonestate); callphoneButton = (Button) findViewById(R.id.callphone); vibratorButton = (Button) findViewById(R.id.vibrator); } /**为按钮添加监听*/ public void regiestListener(){ startServiceButton.setOnClickListener(startService); shutDownServiceButton.setOnClickListener(shutdownService); startBindServiceButton.setOnClickListener(startBinderService); sendBroadcast.setOnClickListener(broadcastReceiver); notificationButton.setOnClickListener(notification); alarmButton.setOnClickListener(startAlarm); handlerButton.setOnClickListener(handler); asyncButton.setOnClickListener(async); phoneStateButton.setOnClickListener(phonestate); callphoneButton.setOnClickListener(callphoneEvent); vibratorButton.setOnClickListener(vibrator); } /**启动服务的事件监听*/ public Button.OnClickListener startService = new Button.OnClickListener(){ public void onClick(View view){ /**单击按钮时启动服务*/ Intent intent = new Intent(MainStadyServics.this,CountService.class); startService(intent); Log.v("MainStadyServics", "start Service"); } }; /**关闭服务*/ public Button.OnClickListener shutdownService = new Button.OnClickListener(){ public void onClick(View view){ /**单击按钮时启动服务*/ Intent intent = new Intent(MainStadyServics.this,CountService.class); /**退出Activity是,停止服务*/ stopService(intent); Log.v("MainStadyServics", "shutDown serveice"); } }; /**打开绑定服务的Activity*/ public Button.OnClickListener startBinderService = new Button.OnClickListener(){ public void onClick(View view){ /**单击按钮时启动服务*/ Intent intent = new Intent(MainStadyServics.this,UseBrider.class); startActivity(intent); Log.v("MainStadyServics", "start Binder Service"); } }; /**打开广播学习的按钮*/ public Button.OnClickListener broadcastReceiver = new Button.OnClickListener(){ public void onClick(View view){ Intent intent = new Intent(MainStadyServics.this,UseBroadcast.class); startActivity(intent); Log.v("MainStadyServics","start broadcast"); } }; /**打开通知*/ public Button.OnClickListener notification = new Button.OnClickListener(){ public void onClick(View view){ Intent intent = new Intent(MainStadyServics.this, UseNotification.class); startActivity(intent); Log.v("MainStadyService ","start Notification"); } }; /**使用闹钟*/ public Button.OnClickListener startAlarm = new Button.OnClickListener(){ public void onClick(View view){ Intent intent = new Intent(MainStadyServics.this, UseAlarmManager.class); startActivity(intent); Log.v("MainStadyService ","start alarm"); } }; public Button.OnClickListener handler= new Button.OnClickListener(){ public void onClick(View view){ Intent intent = new Intent(MainStadyServics.this, UseHandleMessage.class); startActivity(intent); Log.v("MainStadyService ","start handle"); } }; public Button.OnClickListener async= new Button.OnClickListener(){ public void onClick(View view){ Intent intent = new Intent(MainStadyServics.this, UseAsyncTask.class); startActivity(intent); Log.v("MainStadyService ","start handle"); } }; public Button.OnClickListener phonestate= new Button.OnClickListener(){ public void onClick(View view){ Intent intent = new Intent(MainStadyServics.this, UsePhoneState.class); startActivity(intent); Log.v("MainStadyService ","start phonestate"); } }; public Button.OnClickListener callphoneEvent= new Button.OnClickListener(){ public void onClick(View view){ Intent intent = new Intent(MainStadyServics.this, UseActionCall.class); startActivity(intent); Log.v("MainStadyService ","start callphone"); } }; public Button.OnClickListener vibrator= new Button.OnClickListener(){ public void onClick(View view){ Intent intent = new Intent(MainStadyServics.this, UseVibrator.class); startActivity(intent); Log.v("MainStadyService ","start callphone"); } }; /***/ protected void onDestroy(){ super.onDestroy(); Intent intent = new Intent(MainStadyServics.this,CountService.class); /**退出Activity是,停止服务*/ stopService(intent); } }
2.启动服务按钮
这个类实现的是第一个按钮的功能,在这个类中新开了一个线程,并每隔一秒打印出一行日志
代码如下:
package lovefang.stadyService; /**引入包*/ import android.app.Service;// 服务的类 import android.os.IBinder; import android.os.Binder; import android.content.Intent; import android.util.Log; /**计数的服务*/ public class CountService extends Service{ /**创建参数*/ boolean threadDisable ; int count; public IBinder onBind(Intent intent){ return null; } public void onCreate(){ super.onCreate(); /**创建一个线程,每秒计数器加一,并在控制台进行Log输出*/ new Thread(new Runnable(){ public void run(){ while(!threadDisable){ try{ Thread.sleep(1000); }catch(InterruptedException e){ } count++; Log.v("CountService","Count is"+count); } } }).start(); } public void onDestroy(){ super.onDestroy(); /**服务停止时,终止计数进程*/ this.threadDisable = true; } public int getConunt(){ return count; } class ServiceBinder extends Binder{ public CountService getService(){ return CountService.this; } } }
3.绑定服务
服务有两种实现的方法:
1.startService,启动服务,这时需要程序员管理服务的生命周期
2.bindService,绑定服务,此时Service与Activity绑定在一起
下面是实现的代码:
package lovefang.stadyService; /**引入包*/ import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.util.Log; /**通过bindService和unBindSerivce的方式启动和结束服务*/ public class UseBrider extends Activity { /**参数设置*/ CountService countService; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new UseBriderFace(this)); Intent intent = new Intent(UseBrider.this,CountService.class); /**进入Activity开始服务*/ bindService(intent, conn, Context.BIND_AUTO_CREATE); } private ServiceConnection conn = new ServiceConnection(){ /**获取服务对象时的操作*/ public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub countService = ((CountService.ServiceBinder)service).getService(); } /**无法获取到服务对象时的操作*/ public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub countService =null; } }; protected void onDestroy(){ super.onDestroy(); this.unbindService(conn); Log.v("MainStadyServics", "out"); } }
4.发送广播
使用sendBroadcast,向一个Action发送广播,并由相应的广播接收器接收并执行相应的动作
实现的代码如下:
4.1 打开广播服务
package lovefang.stadyService; /**引入包*/ import android.view.View; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.widget.Button; /**使用Broadcast,这是一个发送广播的类*/ public class UseBroadcast extends Activity{ /**创建参数*/ private Button sendBroadcast; /**创建Activity*/ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.broadcast);// 使用布局文件 getView(); sendBroadcast.setOnClickListener(sendBroadcastClick);// 添加事件监听 } public void getView(){ sendBroadcast = (Button)findViewById(R.id.sendBroadcast); } /**创建事件监听*/ public Button.OnClickListener sendBroadcastClick = new Button.OnClickListener(){ public void onClick(View view){ Intent intent = new Intent();// 创建意图 intent.putExtra("CONTENT", "This is a Braodcast demo");// 设置广播的内容 intent.setAction("lovefang.stadyService");// 设置广播的Action sendBroadcast(intent); } }; }
4.2 处理广播消息
package lovefang.stadyService; /***/ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; /**这是一个接收广播的类*/ public class UseBroadcastReceiver extends BroadcastReceiver{ public void onReceive(Context context, Intent intent){ Log.v("UseBroadcastReceiver", "I get a message"); } }
5.Notification
这个称之为通知,显示在手机的通知栏,用户可以清除,可以点击
实现的代码如下:
package lovefang.stadyService; import android.content.Intent; import android.os.Bundle; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.net.Uri; import android.media.RingtoneManager; import android.widget.Button; import android.view.View; /**使用notification*/ public class UseNotification extends Activity { /**创建组件*/ private Button textButton; private Button soundButton;// 声音通知 private Button vibrateButton;// 震动通知 private Button ledButton;// led通知 private Button offButton;// 关闭通知 NotificationManager notificationManager; /**创建Activity*/ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.notification); getComment(); registerComment(); } /**获取对象*/ public void getComment(){ /**获取Notification对象*/ notificationManager = (NotificationManager)this.getSystemService(NOTIFICATION_SERVICE); textButton = (Button)findViewById(R.id.notificationMessage); soundButton =(Button)findViewById(R.id.notificationSound); vibrateButton = (Button)findViewById(R.id.notificationVibrate); ledButton = (Button)findViewById(R.id.notificationLED); offButton = (Button)findViewById(R.id.offnotification); } /**注册对象*/ public void registerComment(){ textButton.setOnClickListener(notificationMessage); soundButton.setOnClickListener(notificationSound); vibrateButton.setOnClickListener(notificationVibrate); ledButton.setOnClickListener(notificationLed); offButton.setOnClickListener(notificationOff); } public Button.OnClickListener notificationMessage = new Button.OnClickListener(){ public void onClick(View view){ Notification notification = new Notification();// 创建Notification对象 notification.icon = R.drawable.icon; notification.tickerText = "This is text notication";// 设置通知消息 /**单击通知后的Intent,此例子单击后还是在当前页面*/ PendingIntent intent = PendingIntent .getActivity(UseNotification.this, 0, new Intent(UseNotification.this,UseNotification.class) , 0); /**设置通知消息*/ notification.setLatestEventInfo(UseNotification.this ,"Notification","Content of Notification Demo",intent); /**执行通知*/ notificationManager.notify(0, notification); } }; public Button.OnClickListener notificationSound = new Button.OnClickListener(){ public void onClick(View view){ /**创建通知对象*/ Notification notification = new Notification(); /**获取系统当前声音*/ String ringName = RingtoneManager.getActualDefaultRingtoneUri( UseNotification.this, RingtoneManager.TYPE_RINGTONE) .toString(); /**设置系统当前铃声为此通知的铃声*/ notification.sound = Uri.parse(ringName); /**执行通知*/ notificationManager.notify(0,notification); } }; /**震动通知*/ public Button.OnClickListener notificationVibrate = new Button.OnClickListener(){ public void onClick(View view){ Notification notification = new Notification();// 创建Notification对象 notification.vibrate = new long[] {0, 100, 200, 300};// 设置通知震动模式 notificationManager.notify(0,notification);// 执行通知 } }; /**LED通知*/ public Button.OnClickListener notificationLed = new Button.OnClickListener(){ public void onClick(View view){ Notification notification = new Notification();// 创建Notification对象 notification.ledOnMS = 300;// 设置led开始闪光的时间 notification.ledOffMS = 1000;// 设置关闭时的闪光时间 notificationManager.notify(0,notification);// 执行通知 } }; /**关闭通知*/ public Button.OnClickListener notificationOff = new Button.OnClickListener(){ public void onClick(View view){ notificationManager.cancel(0);// 关闭通知 } }; }
6.Alarm
闹钟服务
package lovefang.stadyService; import android.app.Activity; import android.os.Bundle; import android.widget.Button; import android.view.View; import android.app.AlarmManager; import java.util.Calendar; public class UseAlarmManager extends Activity { /**创建参数*/ private Button startAlarm; private Button shutdownAlarm; private AlarmManager alarm; /**创建Activity*/ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.usealarmmanager); getWidget(); } public void getWidget(){ startAlarm = (Button)findViewById(R.id.startAlarm); shutdownAlarm = (Button)findViewById(R.id.shutDowntAlarm); alarm = (AlarmManager)getSystemService(ALARM_SERVICE);// 获取AlarmManager } public void registerWidget(){ startAlarm.setOnClickListener(startAlarms); shutdownAlarm.setOnClickListener(shutdownAlarms); } /**启动闹钟*/ public Button.OnClickListener startAlarms = new Button.OnClickListener(){ public void onClick(View view){ // 设置10秒后出发闹钟 Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis());// 设置calendar的时间 calendar.add(Calendar.SECOND, 10); alarm.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), null); } }; public Button.OnClickListener shutdownAlarms = new Button.OnClickListener(){ public void onClick(View view){ alarm.cancel(null); } }; }
7.获取手机的状态
这个功能实现的是获取用户手机的一些定义的信息
package lovefang.stadyService; /**引入包*/ import android.os.Bundle; import android.app.Activity; import android.app.Service; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.content.ContentResolver;//This class provides applications access to the content model. import android.telephony.TelephonyManager; import android.util.Log; /**获取手机的状态*/ public class UsePhoneState extends Activity{ /**创建参数*/ private ContentResolver cr; private Button getStateButton;// 用来获取用户的手机状态 /**创建Activity*/ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.usephonestate); cr = getContentResolver(); Log.v("UsePhonestate","cr = getContentResolver()"); Log.v("UsePhonestate","setContentView"); getStateButton = (Button) findViewById(R.id.button_getphonestate); Log.v("UsePhonestate","getStateButton"); getStateButton.setOnClickListener(getState); Log.v("UsePhonestate","getStateButton.setOnClickListener"); } private Button.OnClickListener getState = new Button.OnClickListener(){ public void onClick(View view){ /**获得TelephonyManager对象*/ TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Service.TELEPHONY_SERVICE); /**获取电信网络级别*/ String teleCode = telephonyManager.getNetworkCountryIso(); /**获取电信网络公司代码*/ String teleComCode = telephonyManager.getNetworkOperator(); /**获取电信网络公司名称*/ String teleComName = telephonyManager.getNetworkOperatorName(); /**获取行动通信类型*/ int TypeCode = telephonyManager.getPhoneType(); String type = ""; switch(TypeCode){ case TelephonyManager.PHONE_TYPE_NONE: type = "PHONE_TYPE_NONE"; break; case TelephonyManager.PHONE_TYPE_GSM: type = "PHONE_TYPE_GSM"; break; case TelephonyManager.PHONE_TYPE_CDMA: type = "PHONE_TYPE_CDMA"; break; } /**获取网络类型*/ int netTypeCode = telephonyManager.getNetworkType(); String netType = "NETWORK_TYPE_UNKNOW"; switch(netTypeCode){ case TelephonyManager.NETWORK_TYPE_1xRTT: netType = "NETWORK_TYPE_1xRTT"; break; case TelephonyManager.NETWORK_TYPE_CDMA: netType = "NETWORK_TYPE_CDMA"; break; case TelephonyManager.NETWORK_TYPE_EDGE: netType = "NETWORK_TYPE_EDGE"; break; case TelephonyManager.NETWORK_TYPE_EVDO_0: netType = "NETWORK_TYPE_EVDO_0"; break; case TelephonyManager.NETWORK_TYPE_EVDO_A: netType = "NETWORK_TYPE_EVDO_A"; break; case TelephonyManager.NETWORK_TYPE_GPRS: netType = "NETWORK_TYPE_GPRS"; break; case TelephonyManager.NETWORK_TYPE_HSDPA: netType = "NETWORK_TYPE_HSDPA"; break; case TelephonyManager.NETWORK_TYPE_HSPA: netType = "NETWORK_TYPE_HSPA"; break; case TelephonyManager.NETWORK_TYPE_HSUPA: netType = "NETWORK_TYPE_HSUPA"; break; case TelephonyManager.NETWORK_TYPE_IDEN: netType = "NETWORK_TYPE_IDEN"; break; case TelephonyManager.NETWORK_TYPE_UMTS: netType = "NETWORK_TYPE_UMTS"; break; default: break; } /**获取漫游状态*/ boolean roamStatusCode = telephonyManager.isNetworkRoaming(); String roamStatus = "NOT ROAMINF"; if(roamStatusCode){ roamStatus = "ROAMING"; } /**获取手机唯一标识*/ String imei = telephonyManager.getDeviceId(); /**获取手机IMEI SV*/ String imeiSV = telephonyManager.getDeviceSoftwareVersion(); /**获取手机IMSI*/ String imsi = telephonyManager.getSubscriberId(); /**蓝牙服务*/ String statusCode = android.provider.Settings.System.getString(cr, android.provider.Settings.System.BLUETOOTH_ON); String bulettothStatus = ""; if(statusCode.equals("1")){ bulettothStatus = "ENABLE"; }else{ bulettothStatus = "DISABLE"; } /**飞行模式是否打开*/ statusCode = android.provider.Settings.System.getString(cr, android.provider.Settings.System.AIRPLANE_MODE_ON); String AirplaneStatus = ""; if(statusCode.equals("1")){ AirplaneStatus = "ENABLE"; }else{ AirplaneStatus = "DISABLE"; } /**数据漫游模式是否打开*/ statusCode = android.provider.Settings.System.getString(cr, android.provider.Settings.System.DATA_ROAMING); String dataRoamStatus = ""; if(statusCode.equals("1")){ dataRoamStatus = "ENABLE"; }else{ dataRoamStatus = "DISABLE"; } TextView txt = (TextView) findViewById(R.id.text_showphonestate); StringBuilder sb = new StringBuilder(); sb.append("teleCode: "+teleCode+"\n"); sb.append("teleComCode: "+teleComCode+"\n"); sb.append("teleComName: "+teleComName+"\n"); sb.append("type: "+type+"\n"); sb.append("netType: "+netType+"\n"); sb.append("roamStatus: "+roamStatus+"\n"); sb.append("imei: "+imei+"\n"); sb.append("imeiSV: "+imeiSV+"\n"); sb.append("imsi: "+imsi+"\n"); sb.append("bulettothStatus: "+bulettothStatus+"\n"); sb.append("AirplaneStatus: "+AirplaneStatus+"\n"); sb.append("dataRoamStatus: "+dataRoamStatus+"\n"); txt.setText(sb.toString()); } }; }
8.Vibrator
震动功能,实现对手机震动的管理
package lovefang.stadyService; /***/ import android.os.Bundle; import android.os.Vibrator; import android.app.Activity; import android.view.View; import android.content.Context; import android.widget.Button; /**如何实现手机的震动提示Vibrator*/ public class UseVibrator extends Activity{ /***/ private Button vibrator_1_Button; private Button vibrator_2_Button; private Button vibrator_3_Button; private Vibrator vibrator; /***/ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.use_vibrator); vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE); getWidget(); registerWidget(); } public void getWidget(){ vibrator_1_Button = (Button) findViewById(R.id.button_vibrator_1); vibrator_2_Button = (Button) findViewById(R.id.button_vibrator_2); vibrator_3_Button = (Button) findViewById(R.id.button_vibrator_3); } public void registerWidget(){ vibrator_1_Button.setOnClickListener(vibrator_1); vibrator_2_Button.setOnClickListener(vibrator_2); vibrator_3_Button.setOnClickListener(vibrator_3); } /**震动一次*/ public Button.OnClickListener vibrator_1 = new Button.OnClickListener(){ public void onClick(View view){ /**long参数数组里大参数的含义*/ /**第一个参数表示等待100毫秒后开始震动*/ /**第二个参数表示震动100毫秒后停止震动*/ vibrator.vibrate(new long[]{100,100}, 0); } }; /**震动两次*/ public Button.OnClickListener vibrator_2 = new Button.OnClickListener(){ public void onClick(View view){ vibrator.vibrate(new long[]{1000,3000,1000,3000}, 0); } }; /**震动三次*/ public Button.OnClickListener vibrator_3 = new Button.OnClickListener(){ public void onClick(View view){ vibrator.vibrate(new long[]{1000,1000,1000,2000,1000,300}, 0); } }; }