Service

本文深入探讨了Android中Service与Thread的关系及其应用场景。Service如何独立于UI运行,即使Activity被销毁也能持续工作。通过示例代码介绍了Service的创建、启动、绑定及与Activity之间的交互方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Service和Thread的关系

Service是运行在主线程中的,所以执行一些耗时操作必须在service开一个子线程,那为什么不直接在activity开一个子线程呢?因为activity开一个子线程,如果activity被销毁了,那线程跟着完蛋,而且另外的activity无法对其线程进行操作,而service的运行时完全不需要依赖ui的,即使activity被销毁,哪怕程序被关闭,只要进程在,它都可以继续运行,而且所有activity都可以对service进行关联,

因此,使用Service来处理后台任务,Activity就可以放心地finish,完全不需要担心无法对后台任务进行控制的情况。

普通启动service

首先创建MyService继承service
重新三个方法
onCreate (服务创建时调用的)
onDestroy (服务销毁时调用的)
onStartCommand(每一次启动服务都会调用)

public class MyService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        UserLog.Print("oncreate");
        super.onCreate();
    }
    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        UserLog.Print("onDestroy");
        super.onDestroy();
    }
    /* (non-Javadoc)
     * @see android.app.Service#onStartCommand(android.content.Intent, int, int)
     * startId service启动的次数
     */startId
    @Override   
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        UserLog.Print("onStartCommand"+flags+"---"+startId);
        return super.onStartCommand(intent, flags, startId);
    }

}
public class MainActivity extends Activity {
    private Intent itIntent ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        itIntent = new Intent(this,MyService.class);
    }

    public void start(View view){

        startService(itIntent);
    }
    public void stop(View view){
        stopService(itIntent);
    }

service 和acticity的通讯 用绑定服务

可以指定service执行什么任务
service:
首先在MyService里面创建一个MyBind 类继承Binder 添加需要的操作方法,比如下载downlod();
然后创建MyBind全局变量对象
bindService启动service的时候会调用onBind 方法 ,onBind把MyBind对象return出去,给ServiceConnection 接收
Mainactivity:
创建一个匿名类ServiceConnection 实现连个方法 这两个方法分别会在Activity与Service建立关联和解除关联的时候调用
bindService()方法接收三个参数,第一个参数就是刚刚构建出的Intent对象,第二个参数是前面创建出的ServiceConnection的实例,第三个参数是一个标志位,这里传入BIND_AUTO_CREATE表示在Activity和Service建立关联后自动创建Service,这会使得MyService中的onCreate()方法得到执行,但onStartCommand()方法不会执行。

如果同时点了 startService 跟bindService :
点击Stop Service按钮只会让Service停止,点击Unbind Service按钮只会让Service和Activity解除关联,一个Service必须要在既没有和任何Activity关联又处理停止状态的时候才会被销毁。

public class MyService extends Service {

    private MyBind myBind = new MyBind();
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return myBind;
    }
    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        UserLog.Print("oncreate");
        super.onCreate();
    }
    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        UserLog.Print("onDestroy");
        super.onDestroy();
    }
    /* (non-Javadoc)
     * @see android.app.Service#onStartCommand(android.content.Intent, int, int)
     * startId service启动的次数
     */
    @Override   
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        UserLog.Print("onStartCommand"+flags+"---"+startId);
        return super.onStartCommand(intent, flags, startId);
    }
    class MyBind extends Binder{
        public void downlod(){
            System.out.println("执行下载任务");
        }
    }

}
public class MainActivity extends Activity {
    private Intent itIntent ;
    //
    private ServiceConnection serviceConnection =new ServiceConnection() {

        @Override
        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // TODO Auto-generated method stub

        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        itIntent = new Intent(this,MyService.class);
    }

    public void start(View view){

        bindService(itIntent,serviceConnection , BIND_AUTO_CREATE);
    }
    public void stop(View view){
        unbindService(serviceConnection);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值