Android 四大组件之Service

Service是android系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),它跟Activity的级别差不多,区别是Service只能运行在后台不提供用户界面,并且可以和其他组件进行交互。一个Service是一个可以长期运行在后台的应用程序组件,不提供用户界面。 另一个应用程序组件可以启动一个服务,它将继续在后台运行,即使 用户切换到另一个应用程序。 此外,一个组件可以绑定到一个服务 与之交互,甚至执行进程间通信(IPC)。 例如,一个服务可以在后台处理网络交易、播放音乐、执行文件I / O,或与内容提供者交互等。
一个服务启动方式基本上有两种形式:
Started:
一个服务将被开启,当一个应用程序组件(例如,一个Activity )启动它 调用 startService() 。一个服务一旦启动,可以无限期地在后台运行,即使启动它的组件被摧毁。通常情况下, 开始服务执行一个操作,不向调用者返回一个结果。 例如,它可能通过网络下载或上传文件。 当操作完成, 服务应该自动销毁。
Bound:
一个服务被“绑定”当一个应用程序组件绑定到它通过调用bindService()。一个绑定服务提供了一个客户端 - 服务器接口,允许组件与服务交互,发送请求,得到的结果,甚至这样做跨进程与进程间通信(IPC)。一个service可以同时和多个客户绑定,当多个客户都解除绑定之后,系统会销毁service
注意:一个服务运行在其宿主进程,该服务不会创建自己的线程,并不在一个单独的进程中运行的主线程(除非另行指定)。这意味着,如果你的服务是打算进行任何耗时操作(例如MP3播放或网络下载等),你应该在该服务中创建一个新的线程来执行该工作。通过使用一个单独的线程,你会减少应用程序的不响应(ANR)错误和应用程序的UI主线程可以继续致力于为响应用户的操作。
Service重要方法:
1、onCreate();当服务被创建时调用,只调用一次。
2、onStartCommand();它与startService()对应,当服务启动后调用。如果你重写了该方法,你就必须在任务结束以后,调用stopSelf()或者stopService()来停止服务。如果你是绑定的服务,就不需重新该方法了。
3、onBind();它与bindService()对应,通过返回IBinder,来与service交流。如果你并不想绑定它,就直接返回null

4、onDestroy();当服务不再被使用时需要销毁时调用,你应该在这里用来停止线程,注销监听器,广播。


Service生命周期:
1、startService(Intent)方式启动:
onCreate()--->onStartCommand(Intent intent, int flags, int startId)
stopService(Intent)、在服务本类中调用stopSelf()关闭服务:
onDestroy()
2、bindService(Intent,ServiceConnection,int)绑定启动:
onCreate()-->onBind(Intent intent)
unbindService(ServiceConnection)解除绑定:
onUnbind(Intent intent)-->onDestroy()


与Activity一样:清单文件注册:

<service android:name=".services.MyService"/>

实例:实现Service与组件进行通信。

1、MyService继承Service

public class MyService extends Service {
    private Random myRandom=new Random();
    private MyBinder binder=new MyBinder();
    private Timer mTimer=new Timer();
    private Callback callback;
    public MyService() {
    }

    /**
     * 定时器处理事件
     */
    TimerTask task = new TimerTask(){

        @Override
        public void run() {
            // TODO Auto-generated method stub
            if(callback!=null){
                /*
                 * 得到随机数据 通过接口回调...
                 */
                callback.getNum(myRandom.nextInt());
            }

        }

    };
    public int getRandomInt(){
        return myRandom.nextInt();
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.i("1111111","onBind-----");
        return binder;
    }

    @Override
    public void onCreate() {
        Log.i("1111111","onCreate-----");

         /*
         * 执行Timer 1000毫秒执行一次
         */
        mTimer.schedule(task, 0, 1000);
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        Log.i("1111111","onStartCommand-----flags=="+flags);
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {

        Log.i("1111111","onDestroy-----");
        mTimer.cancel();
        super.onDestroy();
    }

    @Override
    public boolean onUnbind(Intent intent) {

        Log.i("1111111","onUnbind-----");
        return super.onUnbind(intent);
    }

    public interface Callback {
        void getNum(int num);
    }

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

    public class MyBinder extends Binder{
        public MyService getMyService(){

            return MyService.this;
        }
    }

}

2、ServicesActivity中使用:onResume()时启动,onPause()时解除绑定

public class ServicesActivity extends AppCompatActivity {
    private MyService myService=null;
    private Toast mToast=null;
    private Handler mHandler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            int num= (int) msg.obj;
            if(mToast==null){
                mToast=Toast.makeText(ServicesActivity.this,"num=="+num,Toast.LENGTH_SHORT);
            }else {
                mToast.setText("num=="+num);
            }
            mToast.show();
            super.handleMessage(msg);
        }
    };
    private ServiceConnection conn=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            MyService.MyBinder myBinder= (MyService.MyBinder) iBinder;
            myService=myBinder.getMyService();
            int iii=myService.getRandomInt();//只会执行一次

            myService.getCallBack(new MyService.Callback() {
                @Override
                public void getNum(int num) {
                    Log.i("111111","num==="+num);
                    Message message=new Message();
                    message.what=0;
                    message.obj=num;
                    mHandler.sendMessage(message);
                }
            });
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            Toast.makeText(ServicesActivity.this,"onServiceDisconnected===",Toast.LENGTH_SHORT).show();
            Log.i("111111","onServiceDisconnected===");
        }
    };

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

    @Override
    protected void onResume() {
        bindService(new Intent(this, MyService.class),conn,BIND_AUTO_CREATE);
        super.onResume();
    }

    @Override
    protected void onPause() {
        unbindService(conn);
        super.onPause();
    }

}

猜你喜欢

转载自blog.csdn.net/ZHS_Vistor/article/details/80493939