《》系统服务类——系统级别的Servicehtml
咱们除了可本身建立服务类以外,还可使用系统服务类,好比:来电服务类、短信服务类、网络服务类、壁纸服务类、电源服务类等等,接下来咱们就介绍一下经常使用的系统服务类,可是咱们并不会将每一个类中的全部的功能都介绍一下,只会举一两个典型的用法,至于其余的功能能够随时查阅官方文档,得到系统服务类的方法为Context的以下方法:java
getSystemService(Context.TELEPHONY_SERVICE);android
其中的TELEPHONY_SERVICE字段是Context为咱们提供的常量,返回不一样的系统服务能够更改这个字段,上面的这个字段是返回来电服务类数组
一、网络管理服务——ConnectivityManager网络
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //经过getSystemService()方法获得connectionManager这个系统服务类,专门用于管理网络链接 ConnectivityManager connectionManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); //用于返回网络信息对象 NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo(); //断定当前的网络是否可用,即网络是否处于链接状态 if(networkInfo != null && networkInfo.isAvailable()){ Toast.makeText(MainActivity.this, "network is available",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(MainActivity.this, "network is unavailable",Toast.LENGTH_SHORT).show(); } }
另外,查询系统的网络状态是须要申明权限的,打开清单文件,添加以下权限:ide
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
注:访问http://developer.android.com/reference/android/Manifest.permission.html能够查看Android系统全部的可声明的权限。oop
二、电话管理服务类——TelephonyManager布局
当有来电时,将电话号码记入指定的文件中ui
public class MonitorPhone extends Activity { TelephonyManager tManager; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 取得TelephonyManager对象 tManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); // 建立一个通话状态监听器 PhoneStateListener listener = new PhoneStateListener() { @Override public void onCallStateChanged(int state, String number) { switch (state) { // 无任何状态 case TelephonyManager.CALL_STATE_IDLE: break; case TelephonyManager.CALL_STATE_OFFHOOK: break; // 来电铃响时 case TelephonyManager.CALL_STATE_RINGING: OutputStream os = null; try { os = openFileOutput("phoneList", MODE_APPEND); } catch (FileNotFoundException e) { e.printStackTrace(); } PrintStream ps = new PrintStream(os); // 未来电号码记录到文件中 ps.println(new Date() + " 来电:" + number); ps.close(); break; default: break; } super.onCallStateChanged(state, number); } }; // 监听电话通话状态的改变 tManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); } }
配置监听手机通话状态权限this
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
三、短信管理服务——SmsManager
下面的程序是用来发送短信,这个布局界面很是简单:两个输入文本框,一个用于输入手机号码,一个用于输入短信的内容,还有一个按钮,当咱们点击这个按钮的时候就会发送信息,
public class MainActivity extends Activity { Button send ; EditText number , content ; SmsManager sManager ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button send = (Button)findViewById(R.id.sendButton); final EditText number =(EditText)findViewById(R.id.number); final EditText content =(EditText)findViewById(R.id.content); //获取SmsManager sManager = SmsManager.getDefault(); send.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, new Intent(), 0); //发送信息 sManager.sendTextMessage(number.getText().toString(), null, content.getText().toString(), pi, null); Toast.makeText(MainActivity.this, "消息成功送达", 3000).show(); } }); } }
以后须要给这个Activity赋予发送短信的权限
<uses-permission android:name="android.permission.SEND_SMS"/>
四、音频管理服务类——AudioManager
在程序得到了AudioManager对象以后,接下来就可以调用AudioManager的以下经常使用的方法来控制手机音频了:
①adjustStreamVolume(int streamType , int direction , int flags)
调整手机指定类型的声音。其中第一个参数streamType是定声音的类型,该参数可接受以下的几个值:
STREAM_ALARM:手机闹铃的声音
STREAM_DTMF:DTMF音调声音
STREAM_MUSIC:手机音乐的声音
STREAM_NOTIFICATION:系统提示音
STREAM_SYSTEM:手机系统的声音
STREAM_RING:手机铃声的声音
STREAM_VOICE_CALL:语音电话的声音
第二个参数指定对声音的增大和减小,第三个参数是调整声音时显示的标志,例如指定FLAG_SHPW_UI,则在调整声音的大小的时候将会出现一个显示几秒钟的音量圈
②setMicrophoneMute(boolean on )设置是否让麦克静音
③setMode(int mode )设置声音的模式,可设置值有NORMAL ,RINGTONE、IN_CALL
④setRingerMode(int ringerMode) 设置手机的电话铃声模式,可支持一下几种属性值:
RINGER_MODE_NORMAL:正常的手机铃声
RINGER_MODE_SILENT:手机铃声静音
RINGER_MODE_VIBRATE:手机震动
⑤setSpeakerphoneOn(boolean on):设置是否打开扩音器
⑥setStreamMute(int streamType , boolean state)
将手机的指定类型的声音调整为静音,其中的streamType参数与adjustStreamVolume方法中的第一个参数的意义相同。
⑦setStreamVolume(int streamType , int index ,int flags)
直接设置手机的指定类型的音量值。其中第一个参数的意义和上面的那个参数同样
下面就举一个例子,这个例子用来播放音乐,布局中有四个按钮,play用于播放音乐 , up用于增大音量 , down用于减小音量 , 还有一个ToggleButton 开关 mute用于指定是否静音,其中使用了MediaPlayer来播放音乐,
public class MainActivity extends Activity { Button play , up , down ; ToggleButton mute ; AudioManager aManager ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取系统音频服务 aManager = (AudioManager)getSystemService(Service.AUDIO_SERVICE); play= (Button)findViewById(R.id.play); up = (Button)findViewById(R.id.up); down = (Button)findViewById(R.id.down); mute = (ToggleButton)findViewById(R.id.toggle); play.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { 初始化MediaPlayer对象,准备播放音乐,
其中的R.raw.earth引用的是res资源文件中的一个MP3音频文件,须要在res文件中新建一个名为raw的
文件,在其中放入一个名为earth.mp3的文件便可 MediaPlayer mPlayer = MediaPlayer.create(MainActivity.this, R.raw.earth); mPlayer.setLooping(true) ; mPlayer.start(); } }); up.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI); } }); down.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI); } }); mute.setOnCheckedChangeListener(new OnCheckedChangeListener(){ @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { //指定是否须要静音 aManager.setStreamMute(AudioManager.STREAM_MUSIC, isChecked); } }); } }
不须要为Activity赋予特殊的权限
五、振动器服务类——Vibrator
Vibrator的使用比较简单,它只有三个简单的方法来控制手机的震动
①vibrate(long milliseconds):控制手机震动milliseconds毫秒
②vibrate(long [] pattern , int repeat):
指定手机以pattern指定的模式震动,例如:指定pattern为new int [400 , 800 , 1200 , 1600] ,就是指定在400ms 800ms 1200ms 1600ms 这些时间点交替启动。关闭手机振动器;其中repeat指定pattern指定的数组的索引,指定对pattern数组中从repeat索引处开始进行震动循环
③cancel( ) :关闭手机震动
实例:当咱们点击Activity的界面的时候就引起震动:
public class MainActivity extends Activity { Vibrator vibrator ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); vibrator = (Vibrator)getSystemService(Service.VIBRATOR_SERVICE); } //重写onTouchEvent方法 @Override public boolean onTouchEvent(MotionEvent event){ Toast.makeText(this, "震动来了", Toast.LENGTH_LONG).show(); vibrator.vibrate(2000); return super.onTouchEvent(event) ; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
六、手机闹钟服务类——AlarmManager
一、AlarmManager表面上看起来用途就是开发手机闹钟的,可是它自己是一个全局的定时器,能够设置在指定的时间或者周期中启动其余的组件,包括Activity Service BroadcastReceiver
二、获取AlarmMannager的方法仍是调用getSystemService(),一旦程序得到了这个服务类的对象以后就可以调用以下的方法完成一些功能:
①set(int type , long triggerAtTime , PendingIntent operation)
设定在triggerAtTime时间启动operation参数指定的组件,其中第一个参数指定定时服务类型,该来行能够有以下的参数接受值:
ELAPSED_REALTIME:指定从如今开始过了必定的时间以后启动operation指定的组件
ELAPSED_REALTIME_WAKEUP:指定从如今开始时间过了必定的时间以后启动operation对应的组件,即便系统关机了也会执行
RTC: 指定当系统调用System.currentTimeMillis()方法返回值与triggerAtTime相等时启动operation 对应的组件
RTC_WAKEUP:指定当系统调用System.currentTimeMillis()方法返回值与triggerAtTime相等时启动operation 对应的组件,即便系统关机了也会执行
③setInexactRepeating(int type , long triggerAtTime , long interval , PendingIntent operation)
设置一个非精确的周期任务。例如:每一个一个小时启动一次,可是系统并不必定老是在每一个小时的开始启动Alarm服务
④setRepeating(int type , long triggerAtTime , long interval , PendingIntent operation)
设置一个周期性执行的定时服务
⑤cancel(PendingIntent operation)
取消定时服务
举例:下面的程序用来开发一个设定闹钟的功能:
AlarmTest.java文件
public class AlarmTest extends Activity { Button setTime; AlarmManager aManager; Calendar currentTime = Calendar.getInstance(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 获取程序界面的按钮 setTime = (Button) findViewById(R.id.setTime); // 获取AlarmManager对象 aManager = (AlarmManager) getSystemService( Service.ALARM_SERVICE); // 为“设置闹铃”按钮绑定监听器。 setTime.setOnClickListener(new OnClickListener() { @Override public void onClick(View source) { Calendar currentTime = Calendar.getInstance(); // 建立一个TimePickerDialog实例,并把它显示出来。 new TimePickerDialog(AlarmTest.this, 0, // 绑定监听器 new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker tp, int hourOfDay, int minute) { // 指定启动AlarmActivity组件 Intent intent = new Intent(AlarmTest.this, AlarmActivity.class); // 建立PendingIntent对象 PendingIntent pi = PendingIntent.getActivity( AlarmTest.this, 0, intent, 0); Calendar c = Calendar.getInstance(); // 根据用户选择时间来设置Calendar对象 c.set(Calendar.HOUR, hourOfDay); c.set(Calendar.MINUTE, minute); // 设置AlarmManager将在Calendar对应的时间启动指定组件 aManager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi); // 显示闹铃设置成功的提示信息 Toast.makeText(AlarmTest.this, "闹铃设置成功啦" , Toast.LENGTH_SHORT).show(); } }, currentTime.get(Calendar.HOUR_OF_DAY), currentTime .get(Calendar.MINUTE), false).show(); } }); } }
AlarmActivity.java文件(注意这个Activity中没有加载任何的布局,只是在时间到达以后显示一个Dialog而已)
public class AlarmActivity extends Activity { MediaPlayer alarmMusic; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 加载指定音乐,并为之建立MediaPlayer对象 alarmMusic = MediaPlayer.create(this, R.raw.alarm); alarmMusic.setLooping(true); // 播放音乐 alarmMusic.start(); // 建立一个对话框 new AlertDialog.Builder(AlarmActivity.this) .setTitle("闹钟") .setMessage("闹钟响了,Go!Go!Go!") .setPositiveButton("肯定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 中止音乐 alarmMusic.stop(); // 结束该Activity AlarmActivity.this.finish(); } }).show(); } }
七、通知服务类——Notification
一、这个服务类可以在手机的通知栏中显示通知
二、Android3.0 增长了Notification.Builder类,经过该类容许开发者更轻松的建立Notification对象,Notification.Builder提供了以下经常使用的方法:
setDefaults() 设置通知LED灯, 音乐 、震动等
setAutoCancel() 设置当点击这条通知后,状态栏自动删除通知
setContentTitle() 设置通知标题
setContentText() 设置通知内容
setSmallcon(int) 为通知设置小图标
setLargeIcon(Bitmap)为通知设置大图标
setTick () 设置通知在状态栏的提示文本
setContentIntent() 设置当点击通知后将要启动的程序组件对应的PendingIntent
(注意:因为当咱们退出应用时,该应用发出的通知依然会显示在标题栏,并不会由于应用的退出而退出,因此应该使用PendingIntent将Intent包装一下)
三、发送一个消息的步骤很是的简单
首先经过Notification.Builder建立一个Builder对象,
以后经过这个对象的上述的方法设置这个Builder对象的属性值
以后调用Builder对象的build()方法,返回Notification对象
最后经过NotificationManager发送上面建立好的Notification对象
四、下面举一个例子:
在布局文件中仅有两个按钮, 当单击一个按钮的时候就会将一条通知发送出去,当咱们点击另外一个按钮的时候就会将这条通知取消
public class MainActivity extends Activity { NotificationManager nm ; //用这个变量来惟一的标定一个Notification对象 final static int NOTIFY = 0x123; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); nm = (NotificationManager)getSystemService(Service.NOTIFICATION_SERVICE) ; } public void send(View view){ Intent intent = new Intent(MainActivity.this , OtherActivity.class); PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0); Notification notify =new Notification.Builder(this) //设置打开通知后, 该标题栏通知自动消失 .setAutoCancel(true) //设置显示在状态栏中的通知提示信息 .setTicker("有新消息") //设置通知的图标,注意图片不可以太大,不然不可以正常的显示 .setSmallIcon(R.drawable.picture) //设置通知内容的标题 .setContentTitle("一条新消息") //设置通知内容 .setContentText("阿奇从远方发来贺电") //设置使用系统默认的声音、默认LED灯 //.setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_LIGHTS) //设置通知的自定义声音 .setSound(Uri.parse("android.resource://com.penglee.notification/"+R.raw.msg)) //设置消息中显示的发送时间 .setWhen(System.currentTimeMillis()) .setShowWhen(true) //设置是否setWhe指定的显示时间 //设置点击通知将要启动程序的Intent .setContentIntent(pi) //返回Notification对象 .build(); //发送通知 nm.notify(NOTIFY , notify); } public void del(View view){ nm.cancel(NOTIFY); } }
五、上面的程序中的setDefault()方法为Notification设置了声音、震动提示、闪光灯等系统级别的属性。该方法的参数可以支持的属性值有:
Notification.DEFAULT_SOUND 使用系统默认的声音
Notification.DEFAULT_VIBRATE 使用系统默认的震动方式
Notification.DEFAULT_LIGHTS 使用系统默认的闪光灯
Notification.DEFAULT_ALL 使用默认的声音、震动 、闪光灯
若是不想使用系统默认的属性的话,能够自定义:
setSound(Uri.parse("file:///sdcard/click.mp3")) ; setVibrate(new long [] {0 , 50 , 100 , 150}) ;
六、注意使用闪关灯和振动器要在Manifest.xml文件中添加权限
<uses-permission android:name="android.permission.FLASHLIGHT"/> <uses-permission android:name="android.permission.VIBRATE"/>
好了先写到这里吧!之后再补充