我想在我的应用中做些什么: 1.当用户打开应用程序时,他将能够看到已经运行的倒数计时器。因此,在这种情况下,我想在textview中显示倒计时数字,每秒都会更新。 2.用户可以将其停止。 3.用户可以退出应用程序,但倒计时仍应继续,并在返回应用程序UI时显示更新时间。
基于以上几点,我理解我需要实现在后台运行的Service。我已阅读this链接但我的问题在于实施。我对如何实现这种方式感到很遗憾。话虽这么说,一旦用户回到应用程序,我也无法想到在UI中显示时间的方法。我也看过this link,但我不确定是否只实现CountDownTimer使它成为一个正在运行的服务。 那我该如何进行和实施呢?任何指向特定教程/代码的链接都表示赞赏。感谢。
更新:到目前为止我能够做到以下几点: MainActivity.java
public class MainActivity extends Activity {
Button btnStart,btnStop;
Intent serviceIntent;
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnStart = (Button) findViewById(R.id.btnStart);
btnStop = (Button) findViewById(R.id.btnStop);
tv = (TextView) findViewById(R.id.timeView);
//final MyCounter timer = new MyCounter(100000,1000);
//tv.setText("100");
//timer.start();
serviceIntent = new Intent(MainActivity.this,MyService.class);
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
startService(serviceIntent);
}
});
btnStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
stopService(serviceIntent);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
MyService.java:
public class MyService extends Service {
MyCounter timer;
@Override
public void onCreate() {
// TODO Auto-generated method stub
timer = new MyCounter(100000,1000);
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
timer.start();
return super.onStartCommand(intent, flags, startId);
}
private class MyCounter extends CountDownTimer{
public MyCounter(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onFinish() {
Toast.makeText(getApplicationContext(), "death", Toast.LENGTH_LONG).show();
stopSelf();
}
@Override
public void onTick(long millisUntilFinished) {
Toast.makeText(getApplicationContext(), (millisUntilFinished/1000)+"", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
timer.cancel();
//stopSelf();
super.onDestroy();
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
}
问题是: 1.除了Toast之外,我不知道如何在MainActivity UI上显示倒计时。 2.当我按下停止按钮时,它不会停止计数。
答案 0 :(得分:1)
使用bindService(Intent服务,ServiceConnection conn,int标志)来绑定倒计时服务,然后在您的服务中,返回包含您的计数的绑定器,并且在您的活动中,实例化的ServiceConnection对象可以处理绑定器。 AIDL也可以这样做,建议先看看如何绑定服务,希望能帮到你。
演示
public class BindService extends Service{
private int count;
private boolean quit;
private MyBinder binder = new MyBinder();
// My Binder
public class MyBinder extends Binder
{
public int getCount()
{
// get the counting status:count
return count;
}
}
@Override
public IBinder onBind(Intent intent)
{
System.out.println("Service is Binded");
// return the binder instance
return binder;
}
@Override
public void onCreate()
{
super.onCreate();
System.out.println("Service is Created");
// counting work
new Thread()
{
@Override
public void run()
{
while (!quit)
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
}
count++;
}
}
}.start();
}
// invoke when the service unbind
@Override
public boolean onUnbind(Intent intent)
{
System.out.println("Service is Unbinded");
return true;
}
@Override
public void onDestroy()
{
super.onDestroy();
this.quit = true;
System.out.println("Service is Destroyed");
}
@Override
public void onRebind(Intent intent)
{
super.onRebind(intent);
this.quit = true;
System.out.println("Service is ReBinded");
}
}
然后是活动
public class MainActivity extends Activity{
Button bind , unbind , getServiceStatus;
BindService.MyBinder binder;
// define a ServiceConnection object
private ServiceConnection conn = new ServiceConnection()
{
// then the Activity connected with the Service, this will be called
@Override
public void onServiceConnected(ComponentName name
, IBinder service)
{
System.out.println("--Service Connected--");
// achieve MyBinder instance
binder = (BindService.MyBinder) service;
}
// then the connection break off
@Override
public void onServiceDisconnected(ComponentName name)
{
System.out.println("--Service Disconnected--");
}
};
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bind = (Button) findViewById(R.id.bind);
unbind = (Button) findViewById(R.id.unbind);
getServiceStatus = (Button) findViewById(R.id.getServiceStatus);
final Intent intent = new Intent();
intent.setAction("org.crazyit.service.BIND_SERVICE");
bind.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View source)
{
//bind Serivce
bindService(intent , conn , Service.BIND_AUTO_CREATE);
}
});
unbind.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View source)
{
//unbind Serivce
unbindService(conn);
}
});
getServiceStatus.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View source)
{
// Toast to show the conut value
Toast.makeText(MainActivity.this
, "Serivce's count value is:" + binder.getCount()
, 4000)
.show();
}
});
}}