Android-undersøgelse bemærker 1-brugstjenester til implementering af timere

Android Study Notes 1 Use Services Implement Timers



Android-undersøgelse bemærker 1-brugstjenester til implementering af timere

I henhold til Mr. Li's anmodning er vi nødt til at implementere en timer gennem service, men der er ikke givet specifikke krav, og vi stoler på selvstudium. Design derefter en simpel funktion, dvs. start timing og stop timing, og vis den tilsvarende tid på samme tid, som kan bruges. Servicekomponenten og måden at binde tjenesten på for at afslutte interaktionen med Tjenesten, se den specifikke implementering nedenfor.

XML-layout

Der bruges kun en tekstkontrol (bruges til at vise timing) og to knapkontroller (henholdsvis bruges til start og slut timing). Her er layoutfilen:
activity_main.xml



<androidx.constraintlayout.widget.ConstraintLayout xmlns:android='http://schemas.android.com/apk/res/android' xmlns:app='http://schemas.android.com/apk/res-auto' xmlns:tools='http://schemas.android.com/tools' android:layout_width='match_parent' android:layout_height='match_parent' tools:context='.MainActivity'> <TextView android:id='@+id/tv' android:layout_width='wrap_content' android:layout_height='wrap_content' android:layout_marginTop='160dp' android:text='Hello Timer!' android:textColor='@color/colorBlack' android:textSize='36sp' app:layout_constraintLeft_toLeftOf='parent' app:layout_constraintRight_toRightOf='parent' app:layout_constraintTop_toTopOf='parent' tools:ignore='InvalidId' /> <Button android:id='@+id/btstar' android:layout_width='wrap_content' android:layout_height='wrap_content' android:text='start the timer' android:layout_marginTop='53dp' app:layout_constraintTop_toBottomOf='@+id/tv' app:layout_constraintLeft_toLeftOf='parent' app:layout_constraintRight_toRightOf='parent' >Button> <Button android:id='@+id/btend' android:layout_width='wrap_content' android:layout_height='wrap_content' android:text='End time' android:layout_marginTop='53dp' app:layout_constraintTop_toBottomOf='@+id/btstar' app:layout_constraintLeft_toLeftOf='parent' app:layout_constraintRight_toRightOf='parent' >Button> androidx.constraintlayout.widget.ConstraintLayout>

Det hele ser sådan ud, så jeg forklarer ikke for meget i denne del



billede



AndroidMainfest

Husk at konfigurere, når du bruger tjenesten! Konfigurer! Konfigurer! Ellers kan der være en dum opførsel, der ikke får den forventede effekt efter at have skrevet koden og er forvirret.
Føj serviceknudepunktet til applikationsknudepunktet
billede

Service

For at oprette et bindemiddelobjekt i den tjeneste, du skal ringe til, skal du være opmærksom på at indstille de tilsvarende onBind- og onUnbind-metoder i onStartCommand-metoden (du kan også tilpasse en metode) til en ny tråd til tid, hvilket er en simpel søvnoperation og en flagtråd Deaktiver samtidig For at stoppe sløjfen er koden som følger

countservice.java



package com.artoria.timecount import android.app.Service import android.content.Intent import android.os.Binder import android.os.IBinder import android.util.Log import android.widget.Toast public class countservice extends Service { private volatile boolean threadDisable Thread timeThread = new Thread() public static int count private LocalBinder binder = new LocalBinder() /** * Create a Binder object and return it to the client that is used by Activity to provide an interface for data exchange */ public class LocalBinder extends Binder { // Declare a method, getService. (Provided to the client to call) countservice getService() { // Return the current object LocalService, so that we can call the public methods of Service on the client side return countservice.this } } @Override public IBinder onBind(Intent intent) { return this.binder } /** * Called when unbinding * @return */ @Override public boolean onUnbind(Intent intent) { return super.onUnbind(intent) } public int onStartCommand(Intent intent, int flags, int startId) { // Let it continue running until it is stopped. Toast.makeText(this, 'start the timer', Toast.LENGTH_LONG).show() count = 0 new Thread(new Runnable() { @Override public void run() { while (!threadDisable){ try{ timeThread.sleep(10) }catch (InterruptedException e){ e.printStackTrace() break } count++ Log.v('countservice','now:'+count) } } }).start() return START_STICKY } @Override public void onDestroy() { this.threadDisable=true super.onDestroy() Toast.makeText(this, 'Time ends', Toast.LENGTH_LONG).show() } public int getCount(){ return count } public void clear(){ count=0 } }

MainActivity

I hovedaktiviteten skal du binde tjenesten, få servicehenvisningen gennem det opnåede IBinder-objekt, så kan du få data og metoder i tjenesten, lytte til to knaphændelser, starte og afslutte tjenesten gennem itente, få tælle værdi gennem serviceobjektet myService og synkroniser Opdater brugergrænsefladen, koden er som følger
MainActivity.java

package com.artoria.timecount import androidx.appcompat.app.AppCompatActivity import android.app.Service import android.content.ComponentName import android.content.Intent import android.content.ServiceConnection import android.os.Bundle import android.os.Handler import android.os.IBinder import android.util.Log import android.view.View import android.widget.Button import android.widget.TextView import java.util.Locale import java.util.Timer import java.util.TimerTask public class MainActivity extends AppCompatActivity { private countservice myService private Timer time = new Timer() private ServiceConnection conn @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) final Button star = (Button) findViewById(R.id.btstar) final Button end = (Button) findViewById(R.id.btend) final TextView tv = (TextView) findViewById(R.id.tv) final Intent t = new Intent(MainActivity.this, countservice.class) conn = new ServiceConnection() { /** * The interface method that interacts with the server is called back when the service is bound. This method gets the IBinder object passed by the bound Service. * Through this IBinder object, the interaction between the host and the Service is realized. */ @Override public void onServiceConnected(ComponentName name, IBinder service) {// Get Binder countservice.LocalBinder binder = (countservice.LocalBinder) service// Get service object myService = binder.getService() } /** * Called back when unbinding. However, it is not called under normal circumstances. Its calling time is when the Service is accidentally destroyed, * For example, this method is automatically called when the memory resources are insufficient. */ @Override public void onServiceDisconnected(ComponentName name) { myService=null } } star.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { Log.v('service', 'star') //myService.clear() bindService(t, conn, Service.BIND_AUTO_CREATE) startService(t) //myService.star() //myService.clear() TimerTask timerTask = new TimerTask() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { tv.setText(showtime(myService.count)) } }) } } if (time == null){ time = new Timer() } time.schedule(timerTask,0,10) } }) end.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { unbindService(conn) stopService(t) } }) } private String showtime(int t) { int s=(t/100)%60 int m=(t/6000)%60 int ms = t%100 return String.format(Locale.CHINA,'%02d : %02d : %02d',m,s,ms) } }

Eksempel på effekt

Kørende effekt på virtuel maskine

billede