1、Service需要掌握线程
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);
}
}
class MyThread2 implements Runnable{
@Override
public void run() {
System.out.print("测试线程");
}
}
class MyThread3 extends Thread {
@Override
public void run() {
new Thread(new MyThread2()).start();
}
/**
* 测试线程开启的方式
*/
public static void main(String[] args){
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{
private static final int TEST_DATA = 3;
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;
}
}
};
class MyBinder extends Binder{
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) {
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;
mIBinder.testM(mTextView);
}
@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) {
Intent intent = new Intent(MainActivity.this , MyService.class);
bindService(intent , new MyServiceConnection(MainActivity.this.getBaseContext()) , BIND_AUTO_CREATE);
}
});
}
}