我有一个按钮,当按下时会开始倒计时,我希望这个倒计时继续直到它结束,即使应用程序关闭或从Activity
. 我知道一种方法是使用后台服务,但我已阅读但我不明白如何实现它。谢谢 !
服务等级
package com.example.ash.carritosbeta1;
import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.os.CountDownTimer;
import android.os.IBinder;
import android.util.Log;
import java.util.concurrent.TimeUnit;
public class ServicioTimer extends Service {
String FORMAT = "%02d:%02d:%02d";
private static String TAG = "Servicio";
public static final String PAQETE = "com.example.ash.carritosbeta1"; //ejemplo com.proyecto.MainActivity
Intent bi = new Intent(PAQETE);
CountDownTimer cdt = null;
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "Comienza el timer...");
cdt = new CountDownTimer(9000, 1000) {
public void onTick(long millisUntilFinished) {
@SuppressLint("DefaultLocale") String tiempo = ""+String.format(FORMAT,
TimeUnit.MILLISECONDS.toHours(millisUntilFinished),
TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) - TimeUnit.HOURS.toMinutes(
TimeUnit.MILLISECONDS.toHours(millisUntilFinished)),
TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) - TimeUnit.MINUTES.toSeconds(
TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)));
//con esto se envia el tiempo
bi.putExtra("Tiempo", tiempo);
sendBroadcast(bi);
}
public void onFinish() {
//se envia el tiempo finalizado
bi.putExtra("Fin", "Tiempo terminado!");
sendBroadcast(bi);
}
}.start();
}
@Override
public void onDestroy() {
cdt.cancel();
Log.i(TAG, "Timer cancelado");
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
}
活动
public class tiempo_carro1 extends AppCompatActivity {
private static String TAG = "Servicio";
TextView contador;
Button inicar, pausar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tiempo_carro1);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
contador=(TextView)findViewById(R.id.mostrar);
contador.setText("00:00:00");
inicar=(Button)findViewById(R.id.iniciar);
inicar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//inicia el servicio
startService(new Intent(tiempo_carro1.this, ServicioTimer.class));
}
});
pausar=(Button)findViewById(R.id.Reinicar);
pausar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
private BroadcastReceiver br = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//aqui obtienes los datos enviados por el servicio
//obtienes el tiempo que lleva
if (intent.getExtras() != null) {
if (intent.hasExtra("Tiempo")) {
String tiempo = intent.getStringExtra("Tiempo");
contador.setText(tiempo);
} if (intent.hasExtra("Fin")) {
//se recibe que se ha finalizado el contador
String tiempo = intent.getStringExtra("Fin");
contador.setText(tiempo);
inicar.setEnabled(true);
//cierras el servicio ya que no es necesario mantenerlo, sera creado al pulsar el boton nuevamente
stopService(new Intent(tiempo_carro1.this, ServicioTimer.class));
}
}
}
};
@Override
public void onResume() {
super.onResume();
registerReceiver(br, new IntentFilter(ServicioTimer.PAQETE));
Log.i(TAG, "Broadcast registrado");
}
@Override
public void onPause() {
super.onPause();
unregisterReceiver(br);
Log.i(TAG, "Broadcast desligado");
}
@Override
public void onStop() {
try {
unregisterReceiver(br);
} catch (Exception ignored) {}
super.onStop();
}
@Override
public void onDestroy() {
stopService(new Intent(tiempo_carro1.this, ServicioTimer.class));
Log.i(TAG, "Termina el servicioo");
super.onDestroy();
}
}
我将向您解释我的做法,操作如下;正如您所指示的那样创建了一个服务,该服务将负责执行倒计时,当按下按钮时,它将从活动中执行。在同一个活动中,使用 a 创建了一个“侦听器”
BroadcastReceiver
,它将接收来自服务的信息,例如经过时间或结束时间。如果activity关闭,则该广播的监听器被淘汰,如果被销毁,则服务终止;这些最后的行为可以根据您的喜好进行修改。实现可能如下:服务:
活动:
显现:
忽略一些小细节,例如您
FORMAT
根据自己的喜好和需求放置和订购它,我冒昧地在代码和日志中添加小注释以帮助您识别事物,任何问题您都可以发表评论,我会尝试尽快解决。编辑:为了补充我的答案,我在 GitHub 上添加了一个代码链接,如果应用程序关闭,持久性问题就解决了,当重新打开它时,倒计时继续。
如果它没有运行,它必须是通过他们在清单中放入服务的路线,或者它可能是可能的错误之一,因为它发生在我身上,我把它放在我管理所有类的文件夹中,所以我找不到它的服务,即使我运行了应用程序,但它没有显示倒计时