Android之广播与服务<一>
来源:互联网 发布:人工智能手抄报资料 编辑:程序博客网 时间:2024/05/17 07:46
转发请注明出处:http://blog.csdn.net/qq_28055429/article/details/52014058
前言:作为四大组件成员--广播和服务,虽然在用户使用时它们通常是隐身的,但是好多地方都有它们的身影,如:发送短信,状态栏通知,夜间模式,后台音乐播放等等....
One ----------- 广播:
一,基本知识:
(1)名字:BroadcastReceiver
(2)作用:用于监听系统全局的广播消息,以便实现系统中不同组件之间的通信
(3)经常用途:飞行模式,后台音乐播放(与Service结合),电池电量,短信收接,电源断接,apk装卸,内存,拍照,开机自启等
二,基本用法:
(1)创建需要启动的BroadcastReceiver的Intent(可以设置Intent的相关属性)
(2)调用Context的sendBroadcast()或sendOrderedBroadcast()方法来启动指定的广播
例子:
在主类中:
Intent intent = new Intent(); //创建要启动广播的Intent intent.setAction("com.maiyu.action.MAIYU_BROADCAST"); //为Intent设置相关属性,这里采用自定义动作(需要去注册) intent.putExtra("msg" , "自定义的广播"); sendBroadcast(intent);自定义广播接收器,一般是继承:
public class MyReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context , "接收到的Action为:" + intent.getAction() + "\n消息内容是:" + intent.getStringExtra("msg") ,Toast.LENGTH_SHORT).show(); }}
然后在Manifest中注册:
<receiver android:name=".MyReceiver"> <intent-filter> <action android:name="com.maiyu.action.MAIYU_BROADCAST"/> </intent-filter> </receiver>
三,广播的分类:
Normal Broadcast ---- 普通广播:同时被接受,无法传递接收处理后的结果,无法终止传播
-------用sendBroadcast()方法发送
Ordered Broadcast------ 有序广播:按等级传播,高--低(可用IntentFilter.setPriority()设置,低于的不能接收到,高的接收后,
可以终止继续传播
-------- 用sendOrderedBroadcast()方法发送
四,另一种常用用法(常用此方法)
使用registerReceiver()来注册,步骤如下:
(1)自定义广播接收器,一般采用继承,然后重写onReceive()方法(可在里面判断动作):
如开机自启设置:
//自定义开机自启广播接收器: class BootCompleteReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { /*Intent.ACTION_BOOT_COMPLETED:是系统开机自启的动作*/ if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){ //FourActivity为当前Activity Intent newIntent = new Intent(context , FourActivity.class); newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(newIntent); } } }
然后在FourActivity中,创建该广播接收器,并去注册:
在onCreate方法中:
BCreceiver = new BootCompleteReceiver();在需要的监听代码中:
//开机自启动的设置 case R.id.startAfterBoot : //下面三行可概括为: // registerReceiver(BCreceiver , new IntentFilter("android.intent.action.BOOT_COMPLETED")); IntentFilter inf = new IntentFilter(); inf.addAction(Intent.ACTION_BOOT_COMPLETED); registerReceiver(BCreceiver , inf); Toast.makeText(FourActivity.this , "开机自启已经完成" , Toast.LENGTH_SHORT).show(); break; case R.id.nostartAfterBoot : if(BCreceiver != null){ unregisterReceiver(BCreceiver); //取消注册 Toast.makeText(FourActivity.this , "开机自启已经取消" , Toast.LENGTH_SHORT).show(); } break;记得添加自启动权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>由此可见:registerReceiver():接收两个参数,
------参数1:自定义的广播接收器对象
------参数2:IntentFilter对象
五,12个例子:拍照启动,耳机插入,电量电池低,电源断开与接入,
墙纸改变,手机重启,APK安装与卸载,SD卡插入与拔出,
系统与区域改变的设置,内存不足与锁屏解锁,开机自启 ,飞行模式设置,
(1)拍照启动:Intent.ACTION_CAMERA_BUTTON
自定义广播接收器TakePhotoReceiver:继承BroadcastReceiver,重写onReceive方法:
//自定义拍照广播接收器: class TakePhotoReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equals(Intent.ACTION_CAMERA_BUTTON)){ Toast.makeText(FourActivity.this , "检测到拍照广播接收器" , Toast.LENGTH_SHORT).show(); } } }
在onCreat方法中,创建该接收器:
TPreceiver = new TakePhotoReceiver();然后在需要的监听地方去实现:
case R.id.startTake : registerReceiver(TPreceiver , new IntentFilter(Intent.ACTION_CAMERA_BUTTON)); Toast.makeText(FourActivity.this , "拍照广播已启动" , Toast.LENGTH_SHORT).show(); break; case R.id.nostartTake : if(TPreceiver != null){ unregisterReceiver(TPreceiver); //取消注册 Toast.makeText(FourActivity.this , "拍照广播已经取消" , Toast.LENGTH_SHORT).show(); } break;
这里不需要添加权限,,,
(2)耳机插入:耳机插入时需要关闭播放效果,开启耳机模式
动作--------Intent.ACTION_HEADSET_PLUG
同理:
自定义广播接收器:EarphoneInsertReceiver ,继承BroadcastReceiver,重写onReceive方法,代码如下;
//自定义拍照广播接收器: class EarphoneInsertReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)){ Toast.makeText(context, "检测到耳机插入广播" , Toast.LENGTH_SHORT).show(); } } }在onCreate方法中创建该接收器:
earphoneIR = new EarphoneInsertReceiver();然后,在需要的地方,去实现和注册:
registerReceiver(earphoneIR , new IntentFilter(Intent.ACTION_HEADSET_PLUG));取消注册:
unregisterReceiver(earphoneIR );
取消注册时只需要广播接收器一个参数..
(3)到(11)的方法类似于上面就不粘贴代码了:
(3)电量电池低:
Action----------Intent.ACTION_BATTERY_LOW
(4)电源断开与接入:
断开 ---------Intent.ACTION_POWER_DISCONNECTED
接入-----------Intent.ACTION_POWER_CONNECTED
(5)手机墙纸改变:
--------- Intent.ACTION_WALLPARER_CHANGED
(6)手机重启:
-------- Intent.ACTION_REBOOT
(7)APK安装与卸载:
安装 ------------Intent.ACTION_PACKAGE_ADDED
卸载 ------------Intent.ACTION_PACKAGE_REMOVED
(8)SD开插入与拔出
插入------------Intent.ACTION_MEDIA_MOUNTED
拔出------------Intent.ACTION_MEDIA_EJECT
(9)系统设置与区域设置的改变
系统设置---------Intent.ACTION_CONFIGURATION_CHANGED
区域设置---------Intent.ACTION_LOCALE_CHANGED
(10)内存不足与锁屏,解锁
内存不足---------Intent.ACTION_DEVICE_STORAGE_LOW
锁屏 --------------Intent.ACTION_SCREEN_OFF
解锁-------------- Intent.ACTION_SCREEN_ON
(11)开机自启:
-----------Intent.ACTION_BOOT_COMPLETED
这里需要权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>(12)飞行模式设置:这里有点不同,详见代码:
布局,两个按钮:分别是开启飞行模式和关闭飞行模式:
<!--定义基本布局:LinearLayout--><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" ><!--定义两个按钮:开启与关闭飞行模式--> <Button android:id="@+id/btn_startflying" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="开启飞行模式" /> <Button android:id="@+id/btn_stopflying" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="关闭飞行模式" /> </LinearLayout>主类中:用sendBroadcast来发送广播,代码如下:
public class MainActivity extends Activity {private Button btnStartFly , btnStopFly;//定义开启与关闭飞行模式按钮private ContentResolver cr;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);cr = getContentResolver();//获取findView();//为控件绑定IDsetListener();//设置监听}//为控件绑定IDprivate void findView() {btnStartFly = (Button) findViewById(R.id.btn_startflying);btnStopFly = (Button) findViewById(R.id.btn_stopflying);}// 设置监听private void setListener() {btnStartFly.setOnClickListener(listener);btnStopFly.setOnClickListener(listener);}OnClickListener listener = new OnClickListener() {@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_startflying:if (Settings.System.getString(cr,Settings.System.AIRPLANE_MODE_ON).equals("0")) {Log.e("AIRPLANE_MODE_ON", "0");// 获取当前飞行模式状态,返回的是String值0,或1.0为关闭飞行,1为开启飞行// 如果关闭飞行,则打开飞行Settings.System.putString(cr,Settings.System.AIRPLANE_MODE_ON, "1");// 设置需要启动的ACTIONIntent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED).putExtra("state", true);;// 发送飞行广播sendBroadcast(intent);Toast.makeText(MainActivity.this,"已开启飞行模式",Toast.LENGTH_SHORT).show();}break;case R.id.btn_stopflying:if (Settings.System.getString(cr,Settings.System.AIRPLANE_MODE_ON).equals("1")) {Log.e("AIRPLANE_MODE_ON", "1");// 获取当前飞行模式状态,返回的是String值0,或1.0为关闭飞行,1为开启飞行// 如果打开飞行,则关闭飞行Settings.System.putString(cr,Settings.System.AIRPLANE_MODE_ON, "0");// 设置需要启动的ACTIONIntent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED).putExtra("state", false);;// 发送飞行广播sendBroadcast(intent);Toast.makeText(MainActivity.this, "已关闭飞行模式",Toast.LENGTH_SHORT).show();}break;}}};}然后添加权限:
<uses-permission android:name="android.permission.WRITE_SETTINGS" />就可以了
TWO --------- 服务:
一,基本知识:
(1)名字:Service
(2)理解:类似于Activity,有自己的生命周期,在后台运行
(3)用法:两个步骤,创建子类,然后去AndroidManifest中配置
--------- (配置该Service时:可通过<intent-filter..../>来指定哪些Intent被启动)
二,基本方法:
第一种:调用startService()时:
onCreate():第一次创建时调用
onStartCommand():每次用户调用startService()时会调用
onDestroy():关闭服务前调用
第二种:调用bindService()时:
onCreate():第一次创建服务时调用
onBind():是Service子类必须实现的方法,返回一个IBinder对象
onUnbind():当服务上的所有客户端断开时调用
三,3个例子:定时任务,开车模式与夜间模式,音量控制
(1)定时任务:
布局:定义四个按钮,定时发送 / 关闭 :广播,服务
<?xml version="1.0" encoding="utf-8"?><!--定义基本布局:LinearLayout--><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!--放置四个按钮:定时发送广播,服务,定时关闭广播,服务--> <Button android:id="@+id/StartBroadcast" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/btn3_second"/> <Button android:id="@+id/StartService" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/btn4_second"/> <Button android:id="@+id/StopBroadcast" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/btn5_second"/> <Button android:id="@+id/StopService" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/btn6_second"/></LinearLayout>
字符串:
<string name="btn3_second">定时发送广播</string> <string name="btn4_second">定时启动服务</string> <string name="btn5_second">停止定时广播</string> <string name="btn6_second">停止定时服务</string>
主类代码:如下:
package testsdcard.com.maiyu.s07_01.activity;import android.app.Activity;import android.app.AlarmManager;import android.app.Notification;import android.app.NotificationManager;import android.app.PendingIntent;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Button;import testsdcard.com.maiyu.s07_01.R;import testsdcard.com.maiyu.s07_01.broadcast.ActionBroadCast;import testsdcard.com.maiyu.s07_01.service.ActionService;/** * Created by maiyu on 2016/7/23. */public class SecondActivity extends Activity { private Button BtnStartBC , BtnStartSR , BtnStopBC , BtnStopSR; //定义启动和停止:服务和广播 private Notification baseNF ; //定义通知对象 private NotificationManager nm ; //定义通知管理对象 private AlarmManager am ; //闹钟管理 private PendingIntent pi1 , pi2 ; //定义延迟发送的请求 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); am = (AlarmManager)getSystemService(ALARM_SERVICE); //获取AlermManager服务 nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); //获取通知服务 findView(); //为控件绑定id setListener(); //为控件设置监听 } //为各个控件设置监听 private void setListener() { BtnStartBC.setOnClickListener(mylistener); BtnStartSR.setOnClickListener(mylistener); BtnStopSR.setOnClickListener(mylistener); BtnStopBC.setOnClickListener(mylistener); } //自定义监听器 View.OnClickListener mylistener = new View.OnClickListener() { @Override public void onClick(View view) { switch (view.getId()){ case R.id.StartBroadcast: //开启闹钟广播 /**4个参数: Context context, int requestCode, Intent intent, int flags */ pi1 = PendingIntent.getBroadcast(SecondActivity.this, 0, new Intent(SecondActivity.this, ActionBroadCast.class), Intent.FILL_IN_ACTION); //得到延迟的PendingIntent long now = System.currentTimeMillis(); /** * 4个参数: * int type, long triggerAtMillis, long intervalMillis, PendingIntent operation */ //设置重复闹钟 am.setInexactRepeating(AlarmManager.RTC_WAKEUP , now , 3000, pi1); break; case R.id.StartService: //获取延迟PendingIntent pi2 = PendingIntent.getService(SecondActivity.this , 0 , new Intent(SecondActivity.this , ActionService.class) , Intent.FILL_IN_ACTION); long now1 = System.currentTimeMillis(); //设置重复闹钟 am.setInexactRepeating(AlarmManager.RTC_WAKEUP , now1 , 3000 , pi2); break; case R.id.StopBroadcast: am.cancel(pi1); //取消延迟的PendingIntent break; case R.id.StopService: am.cancel(pi2); break; default: break; } } }; //为控件绑定Id private void findView() { BtnStartBC = (Button)findViewById(R.id.StartBroadcast); BtnStartSR = (Button)findViewById(R.id.StartService); BtnStopBC = (Button)findViewById(R.id.StopBroadcast); BtnStopSR = (Button)findViewById(R.id.StopService); }}
字符串:
<string name="btn8_second">开启行车模式</string> <string name="btn9_second">关闭行车模式</string> <string name="btn10_second">开启夜间模式</string> <string name="btn11_second">关闭夜间模式</string>
自定义服务类:
package testsdcard.com.maiyu.s07_01.service;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.support.annotation.Nullable;import android.util.Log;/** * Created by maiyu on 2016/7/23. */public class ActionService extends Service { private static int num = 0; @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); Log.e("ActionService" , "New Message ! " + num++); }}
自定义广播接收器:
package testsdcard.com.maiyu.s07_01.broadcast;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;public class ActionBroadCast extends BroadcastReceiver{ private static int num = 0 ; @Override public void onReceive(Context context, Intent intent) { Log.e("AciontBroadCast" ,"new message : " + num++ ); }}这样就行了,,,
(2)开启行车模式和夜间模式:当开车时,需要开启行车模式(电话会自动接入)
布局:同样定义4个按钮:开启和关闭行车模式,开启和关闭夜间模式
<?xml version="1.0" encoding="utf-8"?><!--定义基本布局:LinearLayout--><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!--放置四个按钮:开启和关闭:行车模式,夜间模式--> <Button android:id="@+id/OpenDC" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/btn8_second"/> <Button android:id="@+id/CloseDC" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/btn9_second"/> <Button android:id="@+id/OpenN" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/btn10_second"/> <Button android:id="@+id/CloseN" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/btn11_second"/></LinearLayout>
主类中去,实现:
----先调用服务:UiModeManager
uiModeManager = (UiModeManager)getSystemService(Context.UI_MODE_SERVICE); //获取系统UiModeManager服务再去实现相关方法,
package testsdcard.com.maiyu.s07_01.activity;import android.app.Activity;import android.app.UiModeManager;import android.content.Context;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.Toast;import testsdcard.com.maiyu.s07_01.R;/** * Created by maiyu on 2016/7/23. */public class SecondActivity extends Activity { private UiModeManager uiModeManager ; //UiModeManager对象 private Button BtnOpenDC , BtnCloseDC , BtnOpenN , BtnCloseN; //开车模式和夜间模式 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); uiModeManager = (UiModeManager)getSystemService(Context.UI_MODE_SERVICE); //获取系统UiModeManager服务 findView(); //为控件绑定id setListener(); //为控件设置监听 } //为各个控件设置监听 private void setListener() { //行车模式和夜间模式 BtnOpenDC.setOnClickListener(mylistener); BtnCloseDC.setOnClickListener(mylistener); BtnOpenN.setOnClickListener(mylistener); BtnCloseN.setOnClickListener(mylistener); } //自定义监听器 View.OnClickListener mylistener = new View.OnClickListener() { @Override public void onClick(View view) { switch (view.getId()){ case R.id.OpenDC: //开车模式 uiModeManager.enableCarMode(UiModeManager.ENABLE_CAR_MODE_GO_CAR_HOME); Toast.makeText(SecondActivity.this , "已经开启行车模式",Toast.LENGTH_SHORT).show(); break; case R.id.CloseDC: //关闭开车模式 uiModeManager.disableCarMode(UiModeManager.DISABLE_CAR_MODE_GO_HOME); Toast.makeText(SecondActivity.this , "已经关闭行车模式",Toast.LENGTH_SHORT).show(); break; case R.id.OpenN: //开启夜间模式, uiModeManager.setNightMode(UiModeManager.MODE_NIGHT_YES); Toast.makeText(SecondActivity.this , "已经开启夜间模式",Toast.LENGTH_SHORT).show(); break; case R.id.CloseN: //关闭夜间模式 uiModeManager.setNightMode(UiModeManager.MODE_NIGHT_NO); Toast.makeText(SecondActivity.this , "已经关闭夜间模式",Toast.LENGTH_SHORT).show(); break; default: break; } } }; //为控件绑定Id private void findView() { //行车与夜间模式 BtnOpenDC = (Button)findViewById(R.id.OpenDC); BtnCloseDC = (Button)findViewById(R.id.CloseDC); BtnOpenN = (Button)findViewById(R.id.OpenN); BtnCloseN = (Button)findViewById(R.id.CloseN); }}
(3)音量控制:
布局:三个按钮,当前音量,增大和减少:
<?xml version="1.0" encoding="utf-8"?><!--定义基本布局:LinearLayout--><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!--放置3个按钮:查看,增大,减少--> <Button android:id="@+id/CurrentV" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/btn12_second"/> <Button android:id="@+id/IncreaseV" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/btn13_second"/> <Button android:id="@+id/DeclineV" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/btn14_second"/></LinearLayout>字符串:
<string name="btn12_second">当前音量</string> <string name="btn13_second">增大音量</string> <string name="btn14_second">减少音量</string>
主类中:
先获取音量管理的服务:
audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); //获取声音管理然后再去调用相关方法,具体代码如下:
package testsdcard.com.maiyu.s07_01.activity;import android.app.Activity;import android.content.Context;import android.media.AudioManager;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.Toast;import testsdcard.com.maiyu.s07_01.R;public class SecondActivity extends Activity { private Button BtnCurrentV , BtnIncreaseV , BtnDeclineV; private AudioManager audioManager; //声音管理对象 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); //获取声音管理 findView(); //为控件绑定id setListener(); //为控件设置监听 } //为各个控件设置监听 private void setListener() { //声音 BtnCurrentV.setOnClickListener(mylistener); BtnIncreaseV.setOnClickListener(mylistener); BtnDeclineV.setOnClickListener(mylistener); } //自定义监听器 View.OnClickListener mylistener = new View.OnClickListener() { @Override public void onClick(View view) { switch (view.getId()){ case R.id.CurrentV : //当前音量 //分别得到当前的:通话音量,系统音量,音乐音量,提示声音量 int currentCall = audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL); int currentSystem = audioManager.getStreamVolume(AudioManager.STREAM_SYSTEM); int currentMusic = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); int currentTip = audioManager.getStreamVolume(AudioManager.STREAM_ALARM); Toast.makeText(SecondActivity.this , "当前通话音量:" + currentCall + "\n当前系统音量" + currentSystem + "\n当前音乐音量:" + currentMusic + "\n当前提示音音量:" + currentTip ,Toast.LENGTH_SHORT).show(); break; case R.id.IncreaseV : audioManager.adjustStreamVolume(AudioManager.STREAM_SYSTEM , AudioManager.ADJUST_RAISE , AudioManager.FX_FOCUS_NAVIGATION_UP); break; case R.id.DeclineV : audioManager.adjustStreamVolume(AudioManager.STREAM_SYSTEM ,AudioManager.ADJUST_LOWER , AudioManager.FX_FOCUS_NAVIGATION_UP); break; default: break; } } }; //为控件绑定Id private void findView() { //声音管理 BtnCurrentV = (Button)findViewById(R.id.CurrentV); BtnIncreaseV = (Button)findViewById(R.id.IncreaseV); BtnDeclineV = (Button)findViewById(R.id.DeclineV); }}这样就OK了,
这都只是简单的测试......
待续........
附注:
本文的大部分例子代码下载地址:http://download.csdn.net/detail/qq_28055429/9584895
- Android之广播与服务<一>
- android基础之四——广播与服务(一)
- 广播与服务一
- Android 广播与服务
- Android 广播与服务
- Android广播与服务
- 广播与服务总结一
- Androidの广播与服务
- Android 服务与广播笔记
- Android开发-服务与广播
- Android应用开发基础之广播与服务
- android学习之广播发送与检测网络开启服务
- android基础之四——广播与服务(二)
- Android项目之广播(BroacastReceiver)与服务(Service)
- Android之 广播和服务
- day 07广播与服务(一)
- android学习笔记の广播与服务
- Android-服务与广播实现简单电话录音
- MPAndroidChart使用三之柱形图
- POJ2403 Hay Points
- C++语法 :C/C++ 内存布局详解(经典)
- 一周乱弹(jquery select保留第一项,其余清空2,SimpleDateFormat 最全参考例子3,sql in语句4,jQuery 修改按钮样式及禁用按钮5当单选框值改变时获取单选框的值)
- 如何在网页中动态显示当前时间
- Android之广播与服务<一>
- sg-uap下关于单表操作的从前台到后台的开发流程
- 初识微信二次开发
- 常用排序算法之选择排序
- java的内存区域与内存溢出
- HDU1518 Square(DFS)
- 蓝桥-分糖果(算法训练)
- 编写Spark程序并提交到集群上运行
- Power of Four