您的位置:首页 > 编程语言

第一行代码-9.3 服务的基本用法

2016-02-25 22:45 459 查看
1、定义一个服务

  首先创建,然后注册

// ServiceTest - Service.java
public class MyService extends Service{

@Override
public IBinder onBind(Intent arg0) {
return null;
}

// 服务创建的时候使用
@Override
public void onDestroy() {
super.onDestroy();
}

// 服务启动的时候调用
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}

// 服务销毁的时候调用
@Override
public void onCreate() {
super.onCreate();
}
}


<!-- AndroidManifest.xml -->
<service android:name="com.example.servicetest.MyService"></service>


2、启动或停止服务

<!-- activity_main.xml -->
<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:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/start_service_button"
android:text="启动服务"/>
<Button android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/stop_service_button"
android:text="结束服务"/>
</LinearLayout>


@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.start_service_button:
Intent startIntent = new Intent(MainActivity.this, MyService.class);
startService(startIntent);
break;
case R.id.stop_service_button:
Intent stopIntent = new Intent(MainActivity.this, MyService.class);
stopService(stopIntent);
break;
default:
break;
}
}




  开启服务之后,可以找到正在运行的MyService服务:



2、服务和活动通信

  上一节我们学习了怎样开启和结束一个服务,但是服务开启之后做什么事情还控制不了,也就是说onStartCommand执行什么还不能控制。

  举个例子,现在我要下载一个音乐,于是我开启了下载音乐的服务,执行了onStartCommand()函数,但是接下来我还要暂停下载,或者是停止下载,如果只用上面的代码是做不到的。这里必须借助刚才没有实现的onBind函数。

  修改MyService中的代码,如下:

// MyService.java - 添加的代码
class DownloadBinder extends Binder {

public void startDownload() {
Log.d("MyService", "开始下载!");
}

public int getProgress() {
Log.d("MyService", "获取进度!");
return 0;
}

}

private DownloadBinder mBinder = new DownloadBinder();

@Override
public IBinder onBind(Intent arg0) {
return mBinder;
}


  写好了onBind函数,然后看看怎么在MainActivity中绑定服务:

<Button android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="绑定服务"
android:id="@+id/bind_service_button"/>
<Button android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="解绑服务"
android:id="@+id/unbind_service_button"/>


// MainActivity.java - 增加的部分
private Button mBBindService;
private Button mBUnbindService;

private MyService.DownloadBinder downloadBinder;

private ServiceConnection connection = new ServiceConnection() {

@Override
public void onServiceDisconnected(ComponentName arg0) {
}

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
downloadBinder = (MyService.DownloadBinder) service;
downloadBinder.startDownload();
downloadBinder.getProgress();

}
};
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.start_service_button:
Intent startIntent = new Intent(MainActivity.this, MyService.class);
startService(startIntent);
break;
case R.id.stop_service_button:
Intent stopIntent = new Intent(MainActivity.this, MyService.class);
stopService(stopIntent);
break;
case R.id.bind_service_button:
Intent bindIntent = new Intent(MainActivity.this, MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE); // 绑定服务
break;
case R.id.unbind_service_button:
unbindService(connection); // 解绑服务
break;
default:
break;
}
}


  BIND_AUTO_CREATE的意思是,如果执行bindService的时候服务还没有创建,那么会自动创建活动。

  执行效果:



  注意:如果已经解绑服务了,再次执行unbindService会崩溃,暂时不知道原因。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: