本篇为大家带来的是Android的四大组件之一Service(服务)的使用方式,下面我将为大家带来已下的知识点讲解。
1.Android中Service的启动方式:
2.Android中的服务分类:
大家都知道Service是我们Android中运行在后台的进程,经常用于音乐,视频等方向,其实他也拥有着自己的前台服务,其中用到的知识点就是Notification(通知),这些我们都会在代码中为大家讲解明白。
如果大家需要使用到前台服务,可以通过此网址学习一下Notification的使用:http://blog.csdn.net/qq_20451879/article/details/54564266
Code结构:
1.MainAcitivty、OurService、BookActivity(用于实现通知的点击处理,单纯布局,不用太关注这个类)Code
2.MainAcitivty、OurService Xml Code
3.使用Service的注意点
MainActivity
package com.example.service;
import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener {
private TextView mBind;
private TextView mUnBind;
private TextView mStart;
private TextView mStop;
private ServiceConnection readConnection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 处理
init();
// 活动与服务绑定的链接器
readConnection = new ServiceConnection() {
private OurSercice.ReadBinder read;
// 解绑的时候调用
@Override
public void onServiceDisconnected(ComponentName name) {
}
// 绑定的时候调用
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
read = (OurSercice.ReadBinder) service;
read.startRead();
read.readProgress();
}
};
}
private void init() {
mStart = (TextView) findViewById(R.id.tv_startService);
mStop = (TextView) findViewById(R.id.tv_stopService);
mBind = (TextView) findViewById(R.id.tv_bindService);
mUnBind = (TextView) findViewById(R.id.tv_unbindService);
mStart.setOnClickListener(this);
mStop.setOnClickListener(this);
mBind.setOnClickListener(this);
mUnBind.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
// 开启服务
case R.id.tv_startService:
Intent Startintent = new Intent(this, OurSercice.class);
startService(Startintent);
break;
// 关闭服务
case R.id.tv_stopService:
Intent Stopintent = new Intent(this, OurSercice.class);
stopService(Stopintent);
break;
case R.id.tv_bindService:
Intent Bindintent = new Intent(this, OurSercice.class);
// 参数介绍: 第一个参数指的是我们开启服务的意图 第二个参数指的是
// 我们开启服务之后所要执行的相关操作,这里我理解为如同我们使用startService操作服务的时候,把相关的逻辑写在StartCommand处一样,只不过这个好比我们自定义的一样,让他与活动更贴切
// 第三个参数值得是绑定服务的运行时间,我们这里用的是服务创建的时候
bindService(Bindintent, readConnection, BIND_AUTO_CREATE);
break;
// 解除绑定也意味着销毁服务,同stopService 一样
case R.id.tv_unbindService:
unbindService(readConnection);
break;
default:
break;
}
}
}
OurService
package com.example.service;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
public class OurSercice extends Service {
public OurSercice() {
super();
}
// 如果我们只是简单的使用服务,我们可以对bindService直接抛出异常
// @Override
// public IBinder onBind(Intent intent) {
// throw new UnsupportedOperationException("无绑定,抛出异常");
// }
// 但是服务的产生往往和活动更加贴近,所以我们经常会用到以下的操作方式
// 1,写一个类继承自Binder
class ReadBinder extends Binder {
public ReadBinder() {
super();
}
public void startRead() {
Log.e("tag", "startRead");
}
public void readProgress() {
Log.e("tag", "readProgress");
}
}
// 2.创建实例
ReadBinder mRead = new ReadBinder();
// 3.绑定到服务之上,因为开启服务的方式有俩种,一种是startService 一种是 bindService
@Override
public IBinder onBind(Intent intent) {
return mRead;
}
@Override
public void onCreate() {
super.onCreate();
Log.e("tag", "onCreate");
// 前台服务
Intent Intent = new Intent(this, BookActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(
OurSercice.this, 0, Intent, 0);
Notification notification = new Notification.Builder(this)
.setContentTitle("前台服务")
.setContentText("通过服务操作,我们实现前台服务的操作")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.ic_launcher)
.setLargeIcon(
new BitmapFactory().decodeResource(getResources(),
R.drawable.ic_launcher))
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.build();
startForeground(1, notification);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("tag", "onStartCommand");
Toast.makeText(getApplicationContext(),
"服务开启之后,逻辑操作在onStartCommand方法执行", 0).show();
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.e("tag", "onDestroy");
super.onDestroy();
}
}
MainActivity Xml
<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"
tools:context=".MainActivity" >
<TextView
android:id="@+id/tv_startService"
android:layout_width="match_parent"
android:layout_height="35dp"
android:gravity="center"
android:text="start Service" />
<TextView
android:id="@+id/tv_stopService"
android:layout_width="match_parent"
android:layout_height="35dp"
android:gravity="center"
android:text="stop Service" />
<TextView
android:id="@+id/tv_bindService"
android:layout_width="match_parent"
android:layout_height="35dp"
android:gravity="center"
android:text="bind Service" />
<TextView
android:id="@+id/tv_unbindService"
android:layout_width="match_parent"
android:layout_height="35dp"
android:gravity="center"
android:text="unbind Service" />
LinearLayout>
BookActivity
package com.example.service;
import android.app.Activity;
import android.os.Bundle;
/**
* 此Activity单纯为了响应通知,不用关注
* */
public class BookActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book);
}
}
BookActivity Xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="书名:" />
<TextView
android:layout_width="wrap_content"
android:id="@+id/book_name"
android:layout_height="wrap_content"
android:layout_gravity="center" />
LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="价格:" />
<TextView
android:layout_width="wrap_content"
android:id="@+id/book_price"
android:layout_height="wrap_content"
android:layout_gravity="center" />
LinearLayout>
LinearLayout>
注意点:
1.使用Service我们需要创建一个类继承自Service
2.使用前台服务要学会使用通知,同时他是写在Service的OnCreat生命周期中,主要我们一打开服务,就会显示通知服务
3.我们使用BindService的时候,我们往往回写一个类继承Binder,然后把需要些的方法写进去,之后创建实例传入BindService。在使用的Activity中我们会创建ServiceConnection实现绑定与解绑的相关逻辑操作,这时候记得向下转型
这篇文章目前讲解的就是大家所看到的知识,因为今天是除夕夜,且已过了临近初一的凌晨1点,所以下篇文章为大家带来常见的IntentServcie的产生和作用,因为我们不可能让服务一直运行,我们会让他完成任务后执行相关操作等,所以敬请大家转到下面的链接进行继续学习。
推荐文章:IntentSerivce的使用