(Android四大组件)---Service

本文详细介绍了Android中的Service组件,包括其概念、启动方式、创建及生命周期等,并提供了如何在Service与Activity间进行数据通信的具体示例。
Service
概念
service是一种Android四大组件之一,可以在后台长时间运行
不需要有与用户交互的页面, 只需要在后台运行着做一些事物的处理, 这是后就需要service了.
即使用户跳转至另外一个应用后,Service仍旧在后台运行.
任意应用组件都可以绑定服务,甚至可以完成进程间通讯的任务.
比如说 socket http的网络通信 与服务器保持的推送的链接, 需要下载时, 播放音乐时, 文件 I/O.

Service的启动方式:
Service可以通过两种方式来调用,
(1). start一旦某个组件start一个Service后,Service开始独立运行,不在与原来的组件产生任何关系.
(2). bind 某个组件bind一个Service后,Service为组件提供一个接口,类似于客户端,会进行互相的交互.

1. 创建Service
new -> Service -> Service
2. 启动和关闭Service
Intentintent=newIntent(MainActivity.this,MyService.class);
startService(intent);
stopService(intent);

/**
* 每次startService启动会调用此方法
* */
@Override
public intonStartCommand(Intent intent, int flags, intstartId) {
return super.onStartCommand(intent,flags,startId);
}
3. 绑定和解绑Service
bindService(intent, this, Context.BIND_AUTO_CREATE);
unbindService(this);
@Override
public voidonServiceConnected(ComponentName name,IBinder service) {
System.out.println("Service Connected");
}

@Override
public voidonServiceDisconnected(ComponentName name) {
System.out.println("Service Disconnected");
}

4. 应用关掉之后还可以运行,在Service中重写这个函数
@Override
public intonStartCommand(Intent intent, int flags, intstartId) {

newThread(){
@Override
public voidrun() {
super.run();

while(true) {

System.out.println("服务正在运行...");

try{
sleep(1000);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();

return super.onStartCommand(intent,flags,startId);
}

Service生命周期
onCreate() //创建
onDestroy() //销毁

Service通信
1. Activity传递给Service数据
//方式一: intent传值
//传给Service数据
intent.putExtra("data",etData.getText().toString());
startService(intent);
//service接收(拿到)传过来的数据
@Override
public intonStartCommand(Intent intent, int flags, intstartId) {
//拿到数据
data= intent.getStringExtra("data");
return super.onStartCommand(intent, flags, startId);
}

//Binder传值和接口传值
1.在MyService.java中
public classMyServiceextendsService {

private booleanrunning=false;
privateStringdata="这是默认信息";

publicMyService() {
}

@Override
publicIBinderonBind(Intent intent) {
return newBinder();
}

public classBinderextendsandroid.os.Binder{
public voidsetData(String data){
MyService.this.data= data;
}

publicMyServicegetService(){
returnMyService.this;
}
}

@Override
public intonStartCommand(Intent intent, int flags, intstartId) {
//拿到数据
data= intent.getStringExtra("data");
return super.onStartCommand(intent,flags,startId);
}

@Override
public voidonCreate() {
super.onCreate();

running=true;

newThread(){

@Override
public voidrun() {
super.run();

inti =0;

while(running){
i++;
String str =data+" : "+i;
System.out.println(str);

if(callback!=null){
callback.onDataChange(str);
}

try{
sleep(1000);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}

}.start();
}

@Override
public voidonDestroy() {
super.onDestroy();
running=false;
}


privateCallbackcallback=null;

public voidsetCallback(Callback callback) {
this.callback= callback;
}

publicCallbackgetCallback() {
returncallback;
}

//声明接口
public static interface Callback{
voidonDataChange(String data);
}
}
2. MainActivity.java中
public classMainActivityextendsAppCompatActivityimplementsView.OnClickListener,ServiceConnection {

privateEditTextetData;
privateIntentintent;
privateMyService.Binderbinder=null;
privateTextViewtvOut;

@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

etData= (EditText) findViewById(R.id.etData);
intent=newIntent(this,MyService.class);
tvOut= (TextView) findViewById(R.id.tvOut);

findViewById(R.id.btnStartService).setOnClickListener(this);
findViewById(R.id.btnStopService).setOnClickListener(this);
findViewById(R.id.btnBindService).setOnClickListener(this);
findViewById(R.id.btnUnbindService).setOnClickListener(this);
findViewById(R.id.btnSyncData).setOnClickListener(this);
}

@Override
public voidonClick(View v) {
switch(v.getId()){
caseR.id.btnStartService:
//传给Service数据
intent.putExtra("data",etData.getText().toString());
startService(intent);
break;
caseR.id.btnStopService:
stopService(intent);
break;
caseR.id.btnBindService:
bindService(intent,this,Context.BIND_AUTO_CREATE);
break;
caseR.id.btnUnbindService:
unbindService(this);
break;
caseR.id.btnSyncData:
if(binder!=null){
binder.setData(etData.getText().toString());
}
break;
}
}

@Override
public voidonServiceConnected(ComponentName name,IBinder service) {
binder= (MyService.Binder) service;
//实现接口方法
binder.getService().setCallback(newMyService.Callback() {
@Override
public voidonDataChange(String data) {
Message msg =newMessage();
Bundle b =newBundle();
b.putString("data",data);
msg.setData(b);
//句柄发送消息
handler.sendMessage(msg);
}
});
}

@Override
public voidonServiceDisconnected(ComponentName name) {

}

//主线程更新UI
privateHandlerhandler=newHandler(){
@Override
public voidhandleMessage(Message msg) {
super.handleMessage(msg);
String text = msg.getData().getString("data");
tvOut.setText(text);
}
};
}



系统服务,
由于是Android原生代码,可以通过Android代码来对服务进行交互
Android将BInder封装成普通的Manager类,代码调用时无法察觉是使用了Service
这些服务通过Context.getSystemService(String name)来获得
name决定了获得不同的Manager类, 不同的Manager类有各自的方法来调用系统功能或是访问系统状态

POWER_SEREVICE ("power") PowerManager 电源管理
NOTIFICATION_SERVICE ("notification) NotificationManager通知的管理
LOCATION_SERVICE ("location") LocationManager 定位的控制
CONNECTIVITY_SERVICE ("connection") ConnectifyManager网络连接的管理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值