千家信息网

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

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章主要介绍了android studio如何绑定服务和线程实现计时器,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。实验目的:熟悉
千家信息网最后更新 2025年02月02日android studio如何绑定服务和线程实现计时器

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

实验目的:

熟悉和掌握Android线程的使用

实验要求:

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

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

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

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

实验代码:

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=count0;            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

                        

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

0