Android Service

来源:互联网 发布:河南大学软件学院图片 编辑:程序博客网 时间:2024/06/13 09:45

1、Service需要掌握线程

感谢大神goeasyway的知识分享,配合食用更佳!

简书地址:http://www.jianshu.com/p/7a7db9f8692d

package weizhengzhou.top.interview.ThreadDemo;import android.os.Handler;import android.os.Message;/** * Are you known Thread? *  1、博大精深,百度一下 *  2、进程是资源分配的最小单位。Thread是程序执行流的最小单位 *  3、一个进程可以开启n个线程,n个线程共享进程资源 *//** * 使用Handler机制更新UI * 1、线程中通过调用Handler类实例的sendMessage方法设置通知消息 * 2、通过创建Handler实例时,重写handleMessage(Message msg)方法来实现UI更新 * 3、具体为通过switch(msg.what)点消息进行比对,当获取的消息为线程中设置的消息时,则执行具体业务逻辑。 */public class MyThread extends  Thread{    private Handler mHandler = null;    private int mgsWhat ;    public MyThread(Handler handler  , int mgs){        mHandler = handler;        mgsWhat = mgs;    };    @Override    public void run() {        Message message = new Message();        message.what = mgsWhat;        mHandler.sendMessage(message);    }}//实现Runnable接口class MyThread2 implements Runnable{    @Override    public void run() {        //处理具体业务逻辑        System.out.print("测试线程");    }}//继承Thread实现线程class MyThread3 extends Thread {    @Override    public void run() {        //处理具体业务逻辑        //实现Runnable接口开启线程方法        new Thread(new MyThread2()).start();    }    /**     * 测试线程开启的方式     */    public static void main(String[] args){        //继承Thread开启方法        new MyThread3().start();    }}

2、实现在Service开启线程并进行UI操作

MyService:

package weizhengzhou.top.interview.ServiceDemo;import android.app.Service;import android.content.Context;import android.content.Intent;import android.os.Binder;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.support.annotation.Nullable;import android.util.Log;import android.widget.Toast;/** * Created by 75213 on 2017/7/10. * Are you known Service ? *  1、Service是实现Android程序后台运行的解决方案。 *  2、Service是一个专门在后台处理长时间任务的Android组件。 *  3、service没有UI,适合处理不需要和用户交互但是要求长期运行的任务 * * Attention *  1、Service不会自动开启线程,所有代码都在主线程中运行 *  2、使用Service处理耗时任务需要我们在Service内部手动创建子线程,否则可能出现主线程阻塞情况。 * * So? * * Precondition grasp thread knowledge * Study thread [ThreadDemo] */public class MyService extends Service{    //Handler sendMessage的信息    private static final int TEST_DATA = 3;    //上下文参数即MainActivity.getBaseContent();    private Context mContext;    private Handler mHandler = new Handler(){        @Override        public void handleMessage(Message msg) {            switch (msg.what){                case TEST_DATA:                    Toast.makeText(mContext , "测试" , Toast.LENGTH_LONG).show();                    break;                default:                    break;            }        }    };    //继承Binder,提供给Service的onBind()方法。    class MyBinder extends Binder{        //Service中的自定义方法        //Binder我对它的假设理解为Web代码        public void testM(final Context textView){            new Thread(new Runnable() {                @Override                public void run() {                    mContext = textView;                    Message message = new Message();                    message.what = TEST_DATA;                    mHandler.sendMessage(message);                    stopSelf();                }            }).start();            Log.i("Test" , "TestServiceDemo");        }    }    /**     * 会在服务创建的时候调用     */    @Override    public void onCreate() {        super.onCreate();    }    /**     * 会在每次服务启动的时候调用     */    @Override    public int onStartCommand(Intent intent,int flags, int startId) {        return super.onStartCommand(intent, flags, startId);    }    //会在服务销毁的时候调用    @Override    public void onDestroy() {        super.onDestroy();    }    @Nullable    @Override    public IBinder onBind(Intent intent) {        //返回Binder        //这里理解为将自己写的Web代码提交到tomcat服务器        return new MyBinder();    }}

MyServiceConnection:

package weizhengzhou.top.interview.ServiceDemo;import android.content.ComponentName;import android.content.Context;import android.content.ServiceConnection;import android.os.IBinder;/** * Created by 75213 on 2017/7/10. * 客户端绑定到一个service必须实现ServiceConnection * 在调用bindService时候需要设置(Intent , ServiceConnection , flags) */public class MyServiceConnection implements ServiceConnection{    private MyService.MyBinder mIBinder;    private Context mTextView;    public MyServiceConnection(Context textView){        mTextView = textView;    }    /**     * 系统调用这个来传送在service的onBind()中返回的IBinder.     * @param name     * @param service     */    @Override    public void onServiceConnected(ComponentName name, IBinder service) {        mIBinder =(MyService.MyBinder)service;        //通过引用就可以对Binder中定义的方法进行访问        mIBinder.testM(mTextView);    }    //Android系统在同service的连接意外丢失时调用这个.比如当service崩溃了或被强杀了.当客户端解除绑定时,这个方法不会被调用.    @Override    public void onServiceDisconnected(ComponentName name) {        mIBinder = null;    }}

MainActivity :

package weizhengzhou.top.interview;import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import weizhengzhou.top.interview.ServiceDemo.MyService;import weizhengzhou.top.interview.ServiceDemo.MyServiceConnection;import static weizhengzhou.top.interview.R.id.testButton;public class MainActivity extends AppCompatActivity {    private Button mButton;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mButton = (Button)findViewById(testButton);        mButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                    //获取Service意图                    Intent intent = new Intent(MainActivity.this , MyService.class);                    //进行绑定                    bindService(intent , new MyServiceConnection(MainActivity.this.getBaseContext()) , BIND_AUTO_CREATE);            }        });    }}