service基础
service 和activity 一样, 也有一个从启动到销毁的过程,但是Service的声明周期相对要简单些,如下3个阶段:
* 创建服务 * 开始服务 * 销毁服务
一个服务实际上是一个继承android.app.Service的类。当service经历上面3个阶段时候,会调用相应的方法。
public void onCreate();
public void onStart(intent intent , int startId);
public void onDestroy();
一个服务之会创建一次,销毁一次,但可以开始多次。也就是说onCreate() 和OnDestroy()方法只会被执行一次,OnStart()方法可以执行多次。
我们在用服务的时候,不仅要继承service类,重写其中的方法,而且在androidmenifest.xml文件中,我们也应该进行配置。
在<application>标签中加入如下代码:<service android:enabled="true' android:name=".MyService"/>
其中android:enabled="true",表示MyService服务处于激活状态,虽然目前MyService是激活的,但是系统不会启动MyService,想要启动服务,必须
显示的调用startService()方法。停止服务的话,调用显示stopService().
关于服务的创建和开始服务,有两点需要注意:
(1) 编写一个服务类,该类继承android.app.Service类。Service类涉及到三个声明周期,但是这个三个声明周期在子类中并不一定需要完全
覆盖,可根据需求取舍。在该类中有一个onBind()抽象方法,该方法是一个抽象方法,在Service()子类中必须覆盖,这个方法在 Service
Activity进行绑定的时候被调用。
(2) 在androidmenifest.xml文件中配置<service>标签来对service 进行配置,并将其中的android:enabled属性设置为true.
( 3 ) 调用startService()方法启动服务。停止服务用stopService().
Activity和Service绑定
如果我们仅仅是如上说的,调用startService()方法来启动服务,并未调用stopServie()方法,那么这个服务就会随着android系统的启动而期
启动,关闭而关闭。就是说该服务启动后就一直在后台运行,直到系统android 系统关闭。如果我们希望在启动服务的activity关闭之后,该
服务也关闭,那么我们就要将activity于服务绑定。
参考下面:
当一个 Activity 绑定到一个 Service 上时,它负责维护 Service 实例的引用,允许你对正在运行的 Service 进行一些方法调用。
Activity 能进行绑定得益于 Service 的接口。为了支持 Service 的绑定,实现 onBind 方法 如下所示:
private final IBinder binder = new MyBinder();
@Override
public IBinder onBind(Intent intent) {
return binder;
}
public class MyBinder extends Binder {
MyService getService()
{
return MyService.this;
}
}
Service 和 Activity 的连接可以用 ServiceConnection 来实现。你需要实现一个新的 ServiceConnection ,重写 onServiceConnected 和 onServiceDisconnected 方法,一旦连接建立,你就能得到 Service 实例的引用。
// Reference to the service
private MyService serviceBinder;
// Handles the connection between the service and activity
private ServiceConnection mConnection = new ServiceConnection()
{
public void onServiceConnected(ComponentName className, IBinder service) {
// Called when the connection is made.
serviceBinder = ((MyService.MyBinder)service).getService();
}
public void onServiceDisconnected(ComponentName className) {
// Received when the service unexpectedly disconnects.
serviceBinder = null;
}
};
执行绑定,调用 bindService 方法,传入一个选择了要绑定的 Service 的 Intent (显式或隐式)和一个你实现了的 ServiceConnection 实例,如下的框架代码所示:
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
// Bind to the service
Intent bindIntent = new Intent(MyActivity.this, MyService.class);
bindService(bindIntent, mConnection, Context.BIND_AUTO_CREATE);
}
以上总结三点
(1):Service为了支持被绑定,实现了onBind()方法。 并在其中返回一个IBinder对象, IBinder类中
有获得SERVICE实例的方法。
(2):在Activity中实现用于连接SERVICE和Activity的 ServiceConnection, 一旦连接建立,你就能得到 Service 实例的引用。(相对于第三步来说,第二步的实现是具体的操作。)
(3) 执行绑定,调用 bindService 方法.(相对于第二步来讲,相当于发送命令。)
一旦 Service 对象找到,通过 onServiceConnected 处理函数中获得 serviceBinder 对象就能得到它的公共方法和属性。
Android 应用程序一般不共享内存,但在有些时候,你的应用程序可能想要与其它的应用程序中运行的 Service 交互。
你可以使用广播 Intent 或者通过用于启动 Service 的 Intent 中的 Bundle 来达到与运行在其它进程中的 Service 交互的目的。如果你需要更加紧密的连接的话,你可以使用 AIDL 让 Service 跨越程序边界来实现绑定。 AIDL 定义了系统级别的 Service 的接口,来允许 Android 跨越进程边界传递对象。
在BroadcastReceiver中启动service
如上,我们在启动服务的时候都是先启动了一个activity,然后在activity中启动服务。如果是这样的,稍显复杂了。我们能利用
BroadcastReceiver在系统启动的时候就运行某个服务。这个原理和启动activity 是一样的。
下面是个简单的例子
public class StartupReciver extends BroadcastReceiver{
@Override
public void onReceive(Context, Intent intent){
Intent serviceIntent = new Intent(context,MyService.class);
context.startService(serviceIntent);
Intent activityIntent = new Intent(context,MessageActivity.class);
// 一般我们在BroadcastReceiver中启动activity的话,必须设置如下标识。
activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(activityIntent);
}
}
上面代码启动了一个服务和一个activity.
在androidmenifest.xml 文件中的配置如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.blogjava.mobile.startupservice" android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MessageActivity" android:theme="@android:style/Theme.Dialog"
>
<intent-filter>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="StartupReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</receiver>
<service android:enabled="true" android:name=".MyService" />
</application>
<uses-sdk android:minSdkVersion="3" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
</manifest>
本文详细介绍了Android中Service的基础知识,包括Service的生命周期、启动与销毁过程,以及如何在Activity中绑定Service。此外,还提供了在BroadcastReceiver中启动Service的具体示例。
5880

被折叠的 条评论
为什么被折叠?



