美文网首页
关于Android Service真正的完全详解

关于Android Service真正的完全详解

作者: Taleen_6f6a | 来源:发表于2020-12-18 16:57 被阅读0次

    android service 的三种使用方法
    原文链接:https://blog.csdn.net/javazejian/article/details/52709857

    法一:onCreate()--onStartCommand--onDestroy
    法二:binder onCreate-- onBinder -- onUnBinder -- onDestroy
    法三:Messenger onCreate -- onBinder -- onUnBinder -- onDestory

    法一:onCreate()--onStartCommand--onDestroy

    <manifest ... >
    ...
    <application ... >
        <service android:name=".service.SimpleService" />
        ...
    </application>
    </manifest>
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        private Button startBtn;
        private Button stopBtn;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            startBtn= (Button) findViewById(R.id.startService);
            stopBtn= (Button) findViewById(R.id.stopService);
            startBtn.setOnClickListener(this);
            assert stopBtn != null;
            stopBtn.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            Intent it=new Intent(this, SimpleService.class);
            switch (v.getId()){
                case R.id.startService:
                    startService(it);
                    break;
                case R.id.stopService:
                    stopService(it);
                    break;
            }
        }
    }  
    
    public class SimpleService extends Service {
    
        /**
         * 绑定服务时才会调用
         * 必须要实现的方法  
         * @param intent
         * @return
         */
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        /**
         * 首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或 onBind() 之前)。
         * 如果服务已在运行,则不会调用此方法。该方法只被调用一次
         */
        @Override
        public void onCreate() {
            System.out.println("onCreate invoke");
            super.onCreate();
        }
    
        /**
         * 每次通过startService()方法启动Service时都会被回调。
         * @param intent
         * @param flags
         * @param startId
         * @return
         */
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            System.out.println("onStartCommand invoke");
            return super.onStartCommand(intent, flags, startId);
        }
    
        /**
         * 服务销毁时的回调
         */
        @Override
        public void onDestroy() {
            System.out.println("onDestroy invoke");
            super.onDestroy();
        }
    }
    

    法二:onCreate-- onBinder -- onUnBinder -- onDestroy

    public class LocalService extends Service{
        private final static String TAG = "wzj";
        private int count;
        private boolean quit;
        private Thread thread;
        private LocalBinder binder = new LocalBinder();
    
        /**
         * 创建Binder对象,返回给客户端即Activity使用,提供数据交换的接口
         */
        public class LocalBinder extends Binder {
            // 声明一个方法,getService。(提供给客户端调用)
            LocalService getService() {
                // 返回当前对象LocalService,这样我们就可在客户端端调用Service的公共方法了
                return LocalService.this;
            }
        }
    
        /**
         * 把Binder类返回给客户端
         */
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return binder;
        }
    
    
        @Override
        public void onCreate() {
            super.onCreate();
            Log.i(TAG, "Service is invoke Created");
            thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    // 每间隔一秒count加1 ,直到quit为true。
                    while (!quit) {
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        count++;
                    }
                }
            });
            thread.start();
        }
    
        /**
         * 公共方法
         * @return
         */
        public int getCount(){
            return count;
        }
        /**
         * 解除绑定时调用
         * @return
         */
         @Override
        public boolean onUnbind(Intent intent) {
            Log.i(TAG, "Service is invoke onUnbind");
            return super.onUnbind(intent);
        }
    
        @Override
        public void onDestroy() {
            Log.i(TAG, "Service is invoke Destroyed");
            this.quit = true;
            super.onDestroy();
        }
    }
    
    public class BindActivity extends Activity {
        protected static final String TAG = "wzj";
        Button btnBind;
        Button btnUnBind;
        Button btnGetDatas;
        /**
         * ServiceConnection代表与服务的连接,它只有两个方法,
         * onServiceConnected和onServiceDisconnected,
         * 前者是在操作者在连接一个服务成功时被调用,而后者是在服务崩溃或被杀死导致的连接中断时被调用
         */
        private ServiceConnection conn;
        private LocalService mService;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_bind);
            btnBind = (Button) findViewById(R.id.BindService);
            btnUnBind = (Button) findViewById(R.id.unBindService);
            btnGetDatas = (Button) findViewById(R.id.getServiceDatas);
            //创建绑定对象
            final Intent intent = new Intent(this, LocalService.class);
    
            // 开启绑定
            btnBind.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d(TAG, "绑定调用:bindService");
                    //调用绑定方法
                    bindService(intent, conn, Service.BIND_AUTO_CREATE);
                }
            });
            // 解除绑定
            btnUnBind.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d(TAG, "解除绑定调用:unbindService");
                    // 解除绑定
                    if(mService!=null) {
                        mService = null;
                        unbindService(conn);
                    }
                }
            });
    
            // 获取数据
            btnGetDatas.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mService != null) {
                        // 通过绑定服务传递的Binder对象,获取Service暴露出来的数据
    
                        Log.d(TAG, "从服务端获取数据:" + mService.getCount());
                    } else {
    
                        Log.d(TAG, "还没绑定呢,先绑定,无法从服务端获取数据");
                    }
                }
            });
    
    
            conn = new ServiceConnection() {
                /**
                 * 与服务器端交互的接口方法 绑定服务的时候被回调,在这个方法获取绑定Service传递过来的IBinder对象,
                 * 通过这个IBinder对象,实现宿主和Service的交互。
                 */
                @Override
                public void onServiceConnected(ComponentName name, IBinder service) {
                    Log.d(TAG, "绑定成功调用:onServiceConnected");
                    // 获取Binder
                    LocalService.LocalBinder binder = (LocalService.LocalBinder) service;
                    mService = binder.getService();
                }
                /**
                 * 当取消绑定的时候被回调。但正常情况下是不被调用的,它的调用时机是当Service服务被意外销毁时,
                 * 例如内存的资源不足时这个方法才被自动调用。
                 */
                @Override
                public void onServiceDisconnected(ComponentName name) {
                    mService=null;
                }
            };
        }
    }
    

    法三:Messenger
    onCreate -- onBinder -- onUnBinder -- onDestory

    public class ActivityMessenger extends Activity {
        /**
         * 与服务端交互的Messenger
         */
        Messenger mService = null;
    
        /** Flag indicating whether we have called bind on the service. */
        boolean mBound;
    
        /**
         * 实现与服务端链接的对象
         */
        private ServiceConnection mConnection = new ServiceConnection() {
            public void onServiceConnected(ComponentName className, IBinder service) {
                /**
                 * 通过服务端传递的IBinder对象,创建相应的Messenger
                 * 通过该Messenger对象与服务端进行交互
                 */
                mService = new Messenger(service);
                mBound = true;
            }
    
            public void onServiceDisconnected(ComponentName className) {
                // This is called when the connection with the service has been
                // unexpectedly disconnected -- that is, its process crashed.
                mService = null;
                mBound = false;
            }
        };
    
        public void sayHello(View v) {
            if (!mBound) return;
            // 创建与服务交互的消息实体Message
            Message msg = Message.obtain(null, MessengerService.MSG_SAY_HELLO, 0, 0);
            try {
                //发送消息
                mService.send(msg);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_messenager);
            Button bindService= (Button) findViewById(R.id.bindService);
            Button unbindService= (Button) findViewById(R.id.unbindService);
            Button sendMsg= (Button) findViewById(R.id.sendMsgToService);
    
            bindService.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d("zj","onClick-->bindService");
                    //当前Activity绑定服务端
                    bindService(new Intent(ActivityMessenger.this, MessengerService.class), mConnection,
                            Context.BIND_AUTO_CREATE);
                }
            });
    
            //发送消息给服务端
            sendMsg.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    sayHello(v);
                }
            });
    
    
            unbindService.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Unbind from the service
                    if (mBound) {
                        Log.d("zj","onClick-->unbindService");
                        unbindService(mConnection);
                        mBound = false;
                    }
                }
            });
        }
    
    }
    
    public class MessengerService extends Service {
    
        /** Command to the service to display a message */
        static final int MSG_SAY_HELLO = 1;
        private static final String TAG ="wzj" ;
    
        /**
         * 用于接收从客户端传递过来的数据
         */
        class IncomingHandler extends Handler {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case MSG_SAY_HELLO:
                        Log.i(TAG, "thanks,Service had receiver message from client!");
                        break;
                    default:
                        super.handleMessage(msg);
                }
            }
        }
    
        /**
         * 创建Messenger并传入Handler实例对象
         */
        final Messenger mMessenger = new Messenger(new IncomingHandler());
    
        /**
         * 当绑定Service时,该方法被调用,将通过mMessenger返回一个实现
         * IBinder接口的实例对象
         */
        @Override
        public IBinder onBind(Intent intent) {
            Log.i(TAG, "Service is invoke onBind");
            return mMessenger.getBinder();
        }
    }
    

    相关文章

      网友评论

          本文标题:关于Android Service真正的完全详解

          本文链接:https://www.haomeiwen.com/subject/jrtuactx.html