(Android四大组件)---Service

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
Intent intent = new Intent(MainActivity. this, MyService. class ) ;
startService ( intent ) ;
stopService ( intent ) ;

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

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

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

new Thread(){
@Override
public void run () {
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 int onStartCommand (Intent intent , int flags , int startId) {
//拿到数据
data = intent.getStringExtra( "data" ) ;
return super .onStartCommand(intent, flags, startId);
}

//Binder传值和接口传值
1.在MyService.java中
public class MyService extends Service {

private boolean running = false;
private String data = "这是默认信息" ;

public MyService () {
}

@Override
public IBinder onBind (Intent intent) {
return new Binder() ;
}

public class Binder extends android.os.Binder{
public void setData (String data){
MyService. this . data = data ;
}

public MyService getService (){
return MyService. this;
}
}

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

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

running = true;

new Thread(){

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

int i = 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 void onDestroy () {
super .onDestroy() ;
running = false;
}


private Callback callback = null;

public void setCallback (Callback callback) {
this . callback = callback ;
}

public Callback getCallback () {
return callback ;
}

//声明接口
public static interface Callback{
void onDataChange (String data) ;
}
}
2. MainActivity.java中
public class MainActivity extends AppCompatActivity implements View.OnClickListener , ServiceConnection {

private EditText etData ;
private Intent intent ;
private MyService.Binder binder = null;
private TextView tvOut ;

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

etData = (EditText) findViewById(R.id. etData ) ;
intent = new Intent( 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 void onClick (View v) {
switch (v.getId()){
case R.id. btnStartService :
//传给Service数据
intent .putExtra( "data" , etData .getText().toString()) ;
startService( intent ) ;
break;
case R.id. btnStopService :
stopService( intent ) ;
break;
case R.id. btnBindService :
bindService( intent ,this, Context. BIND_AUTO_CREATE ) ;
break;
case R.id. btnUnbindService :
unbindService( this ) ;
break;
case R.id. btnSyncData :
if ( binder != null ){
binder .setData( etData .getText().toString()) ;
}
break;
}
}

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

@Override
public void onServiceDisconnected (ComponentName name) {

}

//主线程更新UI
private Handler handler = new Handler(){
@Override
public void handleMessage (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网络连接的管理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值