温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

android studio如何绑定服务和线程实现计时器

发布时间:2021-12-20 12:32:46 来源:亿速云 阅读:259 作者:小新 栏目:开发技术

这篇文章主要介绍了android studio如何绑定服务和线程实现计时器,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

实验目的:

熟悉和掌握Android线程的使用

实验要求:

  • 1.完成一个秒表,具备启停功能

  • 2.通过绑定服务实现功能,通过Thread+handler更新界面

这章节没花什么时间去学,其他事情又很多,所以只是简单实现了一下,在生命周期那里还是有些没处理的地方,因此

主要思路是:在服务中启动一个线程实现计数的功能,并且每隔10ms调用一下更新界面的函数,这需要用到Thread+handler,当然还需要一些控制启停的公有函数供activity调用,同过绑定的服务的方式,activity中可以获得服务的实例,所以以activity作为控制器,对不同的按钮事件调用service的控制启停的函数或者计数清零的函数,以此来实现计时器的功能。完成实验后发现这样实现的计时器精度比较粗糙,不过功能正常,更好的思路是使用时间函数,不过在本次实验的目的是练习线程和绑定服务的使用,因此没有继续改动。

android studio如何绑定服务和线程实现计时器

android studio如何绑定服务和线程实现计时器

实验代码:

MyService .java

package com.example.shiyan5; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; public class MyService extends Service {     private final IBinder binder = new MyBinder();     private Thread workThread;     private int count=0;     private boolean c_stop=true;     public MyService() {     }     public void clearcount()     {         count=0;     }     public void countstop(){         c_stop=true;     }     public void countstart(){         c_stop=false;     }     @Override     public void onCreate() {         super.onCreate();         workThread=new Thread(null,backgroundWork);         workThread.start();     }     @Override     public boolean onUnbind(Intent intent) {         return super.onUnbind(intent);     }     public class MyBinder extends Binder {         MyService getService() {             return MyService.this;         }     }     @Override     public IBinder onBind(Intent intent) {         // TODO: Return the communication channel to the service.         return binder;         //throw new UnsupportedOperationException("Not yet implemented");     }     private Runnable backgroundWork =new Runnable() {         @Override         public void run() {             try {                 while(true)                 {                     if(c_stop==false)                     {                         count++;                     }                     MainActivity.UpdateGUI(count);                     Thread.sleep(10);//10毫秒计数一次Z                 }             } catch (InterruptedException e) {                 e.printStackTrace();             }         }     }; }

MainActivity.java

package com.example.shiyan5; import androidx.appcompat.app.AppCompatActivity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity {     static TextView textView1,textView2;     Button bt_clear,bt_stop,bt_start;     MyService mService;     boolean mBound;     static int count;     static Handler handler=new Handler();     private ServiceConnection connection = new ServiceConnection() {         @Override         public void onServiceConnected(ComponentName className, IBinder service) {             MyService.MyBinder binder = (MyService.MyBinder) service;             mService = binder.getService();//通过这个来获取服务的实例             mBound = true;         }         @Override         public void onServiceDisconnected(ComponentName arg0) {             mBound = false;         }     };     public static void UpdateGUI(int s_count)     {         count=s_count;         handler.post(RefreshText);     }     private static Runnable RefreshText=new Runnable() {         @Override         public void run() {             String sa,sb,sc;             int a=count%100;             if(a<10)sa="0"+a;else sa=String.valueOf(a);             int b=(count/100)%60;             if(b<10)sb="0"+b;else sb=String.valueOf(b);             int c=(count/100/60)%60;             if(c<10)sc="0"+c;else sc=String.valueOf(c);             textView2.setText(sc+":"+sb+":"+sa);         }     };     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);         mBound=false;         textView1=(TextView) findViewById(R.id.textview);         textView2=(TextView) findViewById(R.id.textview_2);         bt_clear=(Button) findViewById(R.id.bt_clear);         bt_stop=(Button) findViewById(R.id.bt_stop);         bt_start=(Button) findViewById(R.id.bt_start);         bt_clear.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View view) {                 if(mBound==true){                     mService.clearcount();                     mService.countstop();                 }             }         });         bt_start.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View view) {                 if(mBound==true)                 {                     mService.countstart();                 }             }         });         bt_stop.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View view) {                 if(mBound==true)                 {                     mService.countstop();                 }             }         });     }     @Override     protected void onStart() {         super.onStart();         Intent intent=new Intent(this,MyService.class);         bindService(intent,connection, Context.BIND_AUTO_CREATE);     }     @Override     protected void onStop() {         super.onStop();         unbindService(connection);         mBound=false;     } }

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout     xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="match_parent"     android:layout_height="wrap_content"     android:orientation="vertical"     >     <TextView         android:id="@+id/textview"         android:layout_gravity="center_horizontal"         android:text="计时器"         android:textSize="46sp"         android:layout_width="wrap_content"         android:layout_height="wrap_content"/>          <TextView         android:id="@+id/textview_2"         android:gravity="center"         android:textSize="54sp"         android:layout_width="match_parent"         android:layout_height="wrap_content"/>     <LinearLayout         android:layout_gravity="center_horizontal"         android:layout_width="wrap_content"         android:layout_height="wrap_content">         <Button             android:id="@+id/bt_clear"             android:text="清零"             android:textSize="36sp"             android:layout_width="wrap_content"             android:layout_height="wrap_content"/>         <Button             android:id="@+id/bt_stop"             android:text="暂停"             android:textSize="36sp"             android:layout_width="wrap_content"             android:layout_height="wrap_content"/>         <Button             android:id="@+id/bt_start"             android:text="计时"             android:textSize="36sp"             android:layout_width="wrap_content"             android:layout_height="wrap_content"/>     </LinearLayout> </LinearLayout>

感谢你能够认真阅读完这篇文章,希望小编分享的“android studio如何绑定服务和线程实现计时器”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI