Android Service

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);
            }
        });
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值