您的位置:首页 > 移动开发 > Android开发

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来实现:

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: