Android Service

xiaoxiao2021-02-28  95

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); } }); } }
转载请注明原文地址: https://www.6miu.com/read-37073.html

最新回复(0)