Service的基本使用

Service作为Android四大组件之一可以在很多场合的应用中使用,比如播放音乐、文件下载和文件上传等等,以下通过简短的代码实现了Service的基本使用,以及与Activity界面通信等功能,代码有很详细的注释:
Activity类:

/**
 * 注意:
 * A、将需要在后台执行的任务定义在onStartCommand()方法中,因为Service在UI线程中工作,所以不适合用于耗时的工作,而是应该定义一个子线程;
 * B、服务启动后,参数startId就是该服务的id号
 * C、可以调用stopSelf()来停止服务
 * D、服务器可以重复启动,但是,onCreate()只调用一次,onStartCommand()会调用多次。
 * E、混合开发时:Started Service:负责执行任务,Bind Service:负责将服务的信息返回到Activity
 * @author Administrator
 */
public class MainActivity extends Activity {
    private static final String TAG = MainActivity.class.getSimpleName();//获得完整类名
    private MyBind mBind;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    /**
     * 启动start服务,不能接收到service返回的值(可通过广播实现传值)
     * 启动:startService()
     * 停止:stopSelf()、stopService()
     * onCreate -> onStartCommand -> run -> onDestory
     * @param v
     */
    public void start(View v){
        Intent intent = new Intent(StartedService.ACTION);//隐式启动
        Bundle bundle = new Bundle();
        intent.putExtra("1", "success"); //传值
        this.startService(intent);
    }

    /**绑定bind服务,通过ServiceConnection接收Service返回的值
     * Context.BIND_AUTO_CREATE 自动创建
     * 启动:bindService()
     * 停止:unbindService()
     * onCrete -> onBind -> onUnbind -> onDestory
     * @param v
     */
    public void bind(View v){
        Intent intent = new Intent(StartedService.ACTION);
        intent.putExtra("name", "坚强");  //传值
        this.bindService(intent, new ServiceConnection() {

            @Override
            public void onServiceDisconnected(ComponentName arg0) {
                //数据传递失败是调用
            }

            @Override
            public void onServiceConnected(ComponentName arg0, IBinder arg1) {
                mBind = (MyBind) arg1;
                Log.e(TAG,mBind.getData()+"");
            }
        }, Context.BIND_AUTO_CREATE);
    }
}

public class StartedService extends Service {
    public static final String ACTION = StartedService.class.getName();//获得完整类名
    private static final String TAG = StartedService.class.getSimpleName();//获得类名
    private String s;
    /**
     * 数据处理内部类
     * @author Administrator
     *
     */
    class MyBind extends Binder{
        public String getData(){
            return s;
        }
    }
    @Override
    public IBinder onBind(Intent arg0) {
        Log.e(TAG, "onBind:  "+arg0.getStringExtra("name"));//获得intent传过来的值(BindService)
        return new MyBind();
    }
    @Override
    public void onCreate() {
        super.onCreate();
        Log.e(TAG, "onCreate");
    }

    /**
     * 任务执行类
     * Service.START_REDELIVER_INTENT 如果服务被杀死,则自动重启
     */
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e(TAG, "onStartCommand");

        s = intent.getStringExtra("1");//获得intent传过来的值(startService)

        doTask(s);//处理任务

        return super.onStartCommand(intent, Service.START_REDELIVER_INTENT, startId);
    }
    /**
     * 执行任务
     */
    public void doTask(final String s){
        new Thread(new Runnable() {
            @Override
            public void run() {
                //Log.e(TAG, "数据接收成功:  "+s);
                new MyBind().getData();
                stopSelf();//结束service
            }
        }).start();
    }

}

配置文件:

<service android:name="com.example.mytest5.StartedService">
            <intent-filter>
                <action android:name="com.example.mytest5.StartedService"/>
            </intent-filter>
        </service>

项目源码地址:
http://download.csdn.net/detail/sunshine_mood/9417365
http://download.csdn.net/detail/sunshine_mood/9417479

测试图:
这里写图片描述

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值