Android基础——如何使用Service
2015-08-04 15:17
597 查看
Service作为Android四大组件之一的Service,的确很有必要在这里做一下关于Service用法的总结,同时也可以让自己回顾和巩固一下对Service的认识以及使用。
如何启动和停止一个服务
了解启动服务后如何使用服务内部的规则来执行代码
如何为应用程序绑定一个服务
服务的更多技巧
1. 如何启动和停止一个服务
- XxxService类继承Service类并重写返回IBinder对象的onBind()方法,onBind()方法作为Service的抽象方法必须实,启动XxxService通过startService()方法传入intent从而来启动一个服务,当需要停止服务时可调用stopService()方法,同样需传入intent,或者直接在XxxService中调用stopSelf()方法。
2. 了解启动服务后如何使用服务内部的规则来执行代码
我们在XxxService中重写onBind()方法时,同时也可以重写onCreate(),onStartCommand(),onDestroy()方法,我们在onStartCommand()中执行事务,因为Service和应用程序同样运行在主进程当中,我们不能在onStartCommand()中执行大量耗时工作,所以在onStartCommand()中我们开启线程来执行代码,如果需要在事务执行完后便关闭服务,只需要在线程中的run方法中调用stopSelf()方法。
这里我想用一张图来描述onCreate(),onStartCommand(),onDestory()方法的执行:
3. 如何为应用程序绑定一个服务
我们需要使用ServiceConnection来绑定服务与应用程序,ServiceConenction的具体用法如下:
XxxBinder 继承Binder类,XxxBinder一般作为内部类写在XxxService内部,在 XxxBinder内自定义实现一系列绑定程序后调用的方法,比如说发送一条广播 sendBroadCast(),开始下载startDownload()等,然后我们在Service中的onBind()方法中来返回XxxBinder的对象,当onBind()被调用的时候,就可以得到XxxBinder的对象,调用其中的方法来完成操作。
首先我们在MainActivity中实现ServiceConnection类(new ServiceConnection())并重写它的onServiceConnected()方法与onServiceDisconnected()方法,当我们在MainActivity中写出context.bindService()的时候,XxxService中的onBind()方法被调用,onBind()方法将XxxBinder实例传递给onServiceConnected()方法的第二个参数 Ibinder args; 这个时候我们将值赋给XxxBinder类型变量,然后通过XxxBinder变量调用其中的方法,发送广播或开始下载。达到程序与服务的通信。
当在MainActivity中调用unbind()方法的时候,ServiceConnection的onDisconnected()方法并不会被调用。
这里我们队bindService()的参数做下特别的说明:第一个参数就是刚刚构建出的 Intent 对象,第二个参数是前面创建出的 ServiceConnection 的实例,第三个参数则是一个标志位,这里传入 BIND_AUTO_CREATE 表示在活动和服务进行绑定后自动创建服务。这会使得 MyService 中的 onCreate()方法得到执行,但 onStartCommand()方法不会执行,第三个参数如果为0,则不会自动创建服务,需要自己去startService()。
下面我还是用一个图形来描述service如何绑定:
①③当服务已开启时,bindService()的第三个参数为0时的结构图,MainActivity中调用bindService()方法,然后在调用onBind()方法返回XxxBinder实例到ServiceConnection类的onServiceConnected()方法的第二个参数中
②③当服务未开启时,bindService()的第三个参数BIND_AUTO_CREATE是结构图,MainActivity中调用bindService()方法,服务自动开启时首先调用onCreate(),但是并未调用onStartCommand()方法。然后在调用onBind()方法返回XxxBinder实例到ServiceConnection类的onServiceConnected()方法的第二个参数中。
4. 服务的更多技巧
Service中比较重要的应用技术其中有
Service作为前台服务
IntentService的应用
Service实现定时任务
在这里我着重总结Service实现定时任务,
Service的定时任务要借助AlarmManager来实现:
如何启动和停止一个服务
了解启动服务后如何使用服务内部的规则来执行代码
如何为应用程序绑定一个服务
服务的更多技巧
1. 如何启动和停止一个服务
- XxxService类继承Service类并重写返回IBinder对象的onBind()方法,onBind()方法作为Service的抽象方法必须实,启动XxxService通过startService()方法传入intent从而来启动一个服务,当需要停止服务时可调用stopService()方法,同样需传入intent,或者直接在XxxService中调用stopSelf()方法。
2. 了解启动服务后如何使用服务内部的规则来执行代码
我们在XxxService中重写onBind()方法时,同时也可以重写onCreate(),onStartCommand(),onDestroy()方法,我们在onStartCommand()中执行事务,因为Service和应用程序同样运行在主进程当中,我们不能在onStartCommand()中执行大量耗时工作,所以在onStartCommand()中我们开启线程来执行代码,如果需要在事务执行完后便关闭服务,只需要在线程中的run方法中调用stopSelf()方法。
这里我想用一张图来描述onCreate(),onStartCommand(),onDestory()方法的执行:
3. 如何为应用程序绑定一个服务
我们需要使用ServiceConnection来绑定服务与应用程序,ServiceConenction的具体用法如下:
XxxBinder 继承Binder类,XxxBinder一般作为内部类写在XxxService内部,在 XxxBinder内自定义实现一系列绑定程序后调用的方法,比如说发送一条广播 sendBroadCast(),开始下载startDownload()等,然后我们在Service中的onBind()方法中来返回XxxBinder的对象,当onBind()被调用的时候,就可以得到XxxBinder的对象,调用其中的方法来完成操作。
首先我们在MainActivity中实现ServiceConnection类(new ServiceConnection())并重写它的onServiceConnected()方法与onServiceDisconnected()方法,当我们在MainActivity中写出context.bindService()的时候,XxxService中的onBind()方法被调用,onBind()方法将XxxBinder实例传递给onServiceConnected()方法的第二个参数 Ibinder args; 这个时候我们将值赋给XxxBinder类型变量,然后通过XxxBinder变量调用其中的方法,发送广播或开始下载。达到程序与服务的通信。
当在MainActivity中调用unbind()方法的时候,ServiceConnection的onDisconnected()方法并不会被调用。
这里我们队bindService()的参数做下特别的说明:第一个参数就是刚刚构建出的 Intent 对象,第二个参数是前面创建出的 ServiceConnection 的实例,第三个参数则是一个标志位,这里传入 BIND_AUTO_CREATE 表示在活动和服务进行绑定后自动创建服务。这会使得 MyService 中的 onCreate()方法得到执行,但 onStartCommand()方法不会执行,第三个参数如果为0,则不会自动创建服务,需要自己去startService()。
下面我还是用一个图形来描述service如何绑定:
①③当服务已开启时,bindService()的第三个参数为0时的结构图,MainActivity中调用bindService()方法,然后在调用onBind()方法返回XxxBinder实例到ServiceConnection类的onServiceConnected()方法的第二个参数中
②③当服务未开启时,bindService()的第三个参数BIND_AUTO_CREATE是结构图,MainActivity中调用bindService()方法,服务自动开启时首先调用onCreate(),但是并未调用onStartCommand()方法。然后在调用onBind()方法返回XxxBinder实例到ServiceConnection类的onServiceConnected()方法的第二个参数中。
4. 服务的更多技巧
Service中比较重要的应用技术其中有
Service作为前台服务
IntentService的应用
Service实现定时任务
在这里我着重总结Service实现定时任务,
Service的定时任务要借助AlarmManager来实现:
public class LongRunningService extends Service { @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { new Thread(new Runnable() { @Override public void run() { Log.d("LongRunningService", "executed at " + new Date(). toString()); } }).start(); AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE); int anHour = 60 * 60 * 1000; // 这是一小时的毫秒数 long triggerAtTime = SystemClock.elapsedRealtime() + anHour; Intent i = new Intent(this, AlarmReceiver.class); PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0); manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi); return super.onStartCommand(intent, flags, startId); } }
public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent i = new Intent(context, LongRunningService.class); context.startService(i); } }
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = new Intent(this, LongRunningService.class); startService(intent); } }
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.servicebestpractice" android:versionCode="1" android:versionName="1.0" > …… <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.servicebestpractice.MainActivity" 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 android:name=".LongRunningService" > </service> <receiver android:name=".AlarmReceiver" > </receiver> </application> </manifest>
相关文章推荐
- android 剪切图片
- android 4.2以上版本永不休眠
- android.util.Base64结尾加\n的问题
- Android开源项目第一篇——个性化控件(View)篇
- 在ubuntu12.04上编译android工程
- Android中Acition和Category常量表
- Android Studio Error—Gradle: 错误:编码 GBK 的不可映射字符的
- Android的ListView的每一个Item都有不同的布局
- android几个知识点笔记
- Android中图片大小和屏幕密度的关系讲解
- Android中图片大小和屏幕密度的关系讲解
- Android初学习 - 4.0以后支持的Switch按钮
- Android屏幕适配
- AndroidStudio虚拟机启动失败
- Android BatteryStatsHelper深入理解(and5.1)
- Android 电量监控、关机、重启功能的实现
- Android 自定义ViewGroup 实现FlowLayout,动态添加布局
- android登陆
- Android 扩大view点击范围
- Android实现抽奖转盘