HardBirch

Android提高第五篇之Service

时间:10-11-08 栏目:安卓入门与提高 作者:张飞不张,文采横飞 评论:20 点击: 6,416 次

        上次介绍了《Activity以及Intent的使用》,这次就介绍Service,如果把Activity比喻为前台程序,那么Service就是后台程序,Service的整个生命周期都只会在后台执行。Service跟Activity一样也由Intent调用。在工程里想要添加一个Service,先新建继承Service的类,然后到AndroidManifest.xml -> Application ->Application Nodes中的Service标签中添加。

         Service要由Activity通过startService 或者 bindService来启动,Intent负责传递参数。先贴出本文程序运行截图:

 

本文主要讲解Service的调用,以及其生命周期。

上图是startService之后再stopService的Service状态变化。

上图是bindService之后再unbindService的Service状态变化。

       startService与bindService都可以启动Service,那么它们之间有什么区别呢?它们两者的区别就是使Service的周期改变。由startService启动的Service必须要有stopService来结束Service,不调用stopService则会造成Activity结束了而Service还运行着。bindService启动的Service可以由unbindService来结束,也可以在Activity结束之后(onDestroy)自动结束。

 上图是startService之后再Activity.finish()的Service状态变化,Service还在跑着。

上图是bindService之后再Activity.finish()的Service状态变化,Service最后自动unbindService。

main.xml代码:





















testService.java的源码:

import android.app.Activity;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class testService extends Activity {
Button btnStartMyService,btnStopMyService,btnBindMyService,btnUnbindMyService,btnExit;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnStartMyService=(Button)this.findViewById(R.id.btnStartMyService);
btnStartMyService.setOnClickListener(new ClickEvent());

btnStopMyService=(Button)this.findViewById(R.id.btnStopMyService);
btnStopMyService.setOnClickListener(new ClickEvent());

btnBindMyService=(Button)this.findViewById(R.id.btnBindMyService);
btnBindMyService.setOnClickListener(new ClickEvent());

btnUnbindMyService=(Button)this.findViewById(R.id.btnUnbindMyService);
btnUnbindMyService.setOnClickListener(new ClickEvent());

btnExit=(Button)this.findViewById(R.id.btnExit);
btnExit.setOnClickListener(new ClickEvent());
}
@Override
public void onDestroy()
{
super.onDestroy();
Log.e("Activity","onDestroy");
}

private ServiceConnection _connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
// TODO Auto-generated method stub
}

@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
};
class ClickEvent implements View.OnClickListener{

@Override
public void onClick(View v) {
Intent intent=new Intent(testService.this,MyService.class);
if(v==btnStartMyService){
testService.this.startService(intent);
}
else if(v==btnStopMyService){
testService.this.stopService(intent);
}
else if(v==btnBindMyService){
testService.this.bindService(intent, _connection, Service.BIND_AUTO_CREATE);
}
else if(v==btnUnbindMyService){
if(MyService.ServiceState=="onBind")//Service绑定了之后才能解绑
testService.this.unbindService(_connection);
}
else if(v==btnExit)
{
testService.this.finish();
}

}

}
}

MyService.java的源码:

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {
static public String ServiceState="";
@Override
public IBinder onBind(Intent arg0) {
Log.e("Service", "onBind");
ServiceState="onBind";
return null;
}
@Override
public boolean onUnbind(Intent intent){
super.onUnbind(intent);
Log.e("Service", "onUnbind");
ServiceState="onUnbind";
return false;

}
@Override
public void onCreate(){
super.onCreate();
Log.e("Service", "onCreate");
ServiceState="onCreate";
}
@Override
public void onDestroy(){
super.onDestroy();
Log.e("Service", "onDestroy");
ServiceState="onDestroy";
}
@Override
public void onStart(Intent intent,int startid){
super.onStart(intent, startid);
Log.e("Service", "onStart");
ServiceState="onStart";
}

}

声明: 本文由( 张飞不张,文采横飞 )原创编译,转载请保留链接: Android提高第五篇之Service

Android提高第五篇之Service:目前有20 条留言

  1. 20楼
    kf156:

    [e01] 无需多言

    2010-11-08 12:01 [回复]
  2. 牛人啊

    2010-11-09 08:53 [回复]
  3. 18楼
    Markzwei:

    [e01]牛X[e04]

    2010-11-09 14:20 [回复]
  4. 17楼
    weahappy:

    不错,我看了受益匪浅

    2010-11-09 16:02 [回复]
  5. 16楼
    steven_chan:

    [e01],[e03]

    2010-11-10 10:17 [回复]
  6. 15楼
    hugengzong:

    [e03][e04]

    2011-01-27 11:46 [回复]
  7. 14楼
    korry520:

    [e03][e01]

    2011-04-14 11:19 [回复]
  8. 13楼
    wtw11897:

    [e01][e03]

    2011-05-15 20:51 [回复]
  9. [e10]

    2011-05-23 10:01 [回复]
  10. 11楼
    luchen210:

    [e01]niu…

    2011-06-10 17:02 [回复]
  11. 10楼
    laukaka:

    膜拜大神。。。

    2011-11-18 08:46 [回复]
  12. 9楼
    bearray123:

    稀烂。。

    2011-12-01 19:40 [回复]
  13. 8楼
    zengjz88:

    67行,java字符串比较不应该是==号,用equals
    [code=java]
    else if(v==btnUnbindMyService){
    if(MyService.ServiceState=="onBind")//Service绑定了之后才能解绑
    testService.this.unbindService(_connection);
    }
    [/code]

    2011-12-15 11:18 [回复]
  14. 7楼
    hellogv:

    [reply]zengjz88[/reply]
    笔误,呵呵呵,谢谢指点

    2011-12-15 22:26 [回复]
  15. 6楼
    lixin1020:

    写的不错

    不过lz应该多注意java编程规范
    一些小问题早改为好

    2012-02-02 15:15 [回复]
  16. 5楼
    hahajing9:

    写得很好

    2012-04-02 10:20 [回复]
  17. 博主应该把AndroidManifest.xml文件里的也贴出来,建议而已。。。

    2012-04-03 16:55 [回复]
  18. 地板
    hellogv:

    [reply]csf993981061[/reply]
    好的,下一次…

    2012-04-05 14:20 [回复]
  19. 板凳
    nearl2009:

    没有AndroidManifest.xml ,不知道怎么注册运行

    2012-05-23 14:13 [回复]
  20. 沙发
    jan9003:

    旁观

    2012-09-05 17:48 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐