Tas*_*han 7 service android countdowntimer
我想在我的应用程序中做什么:1.当用户打开应用程序时,他将能够看到已经运行的倒数计时器.因此,在这种情况下,我想在textview中显示倒计时数字,每秒都会更新.2.用户可以将其停止.3.用户可以离开应用程序,但倒计时应该仍然继续,并在他返回应用程序UI时显示更新时间.
基于以上几点,我了解到我需要实现在后台运行的服务.我已阅读此链接,但我的问题是实施.我对如何实现这种方式感到很遗憾.话虽这么说,一旦用户回到应用程序,我也无法想到在UI中显示时间的方法.我也看过这个链接 ,但我不确定是否只实现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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是:1.除了Toast之外,我不知道如何在MainActivity UI上显示倒计时.2.当我按下停止按钮时,它不会停止计数.
使用bindService(Intent service, ServiceConnection conn, int flag)绑定你的倒计时服务,然后在你的服务中,返回包含你的计数的活页夹,并且在你的活动中,实例化的ServiceConnection对象可以处理活页夹。AIDL也可以做到这一点,建议先看看如何绑定服务,希望可以帮助你。
\n\n演示
\n\npublic class BindService extends Service{\nprivate int count;\nprivate boolean quit;\nprivate MyBinder binder = new MyBinder();\n// My Binder\npublic class MyBinder extends Binder\n{\n public int getCount()\n {\n // get the counting status\xef\xbc\x9acount\n return count;\n }\n}\n\n@Override\npublic IBinder onBind(Intent intent)\n{\n System.out.println("Service is Binded");\n // return the binder instance\n return binder;\n}\n\n@Override\npublic void onCreate()\n{\n super.onCreate();\n System.out.println("Service is Created");\n // counting work\n new Thread()\n {\n @Override\n public void run()\n {\n while (!quit)\n {\n try\n {\n Thread.sleep(1000);\n }\n catch (InterruptedException e)\n {\n }\n count++;\n }\n }\n }.start(); \n}\n// invoke when the service unbind\n@Override\npublic boolean onUnbind(Intent intent)\n{\n System.out.println("Service is Unbinded");\n return true;\n}\n\n@Override\npublic void onDestroy()\n{\n super.onDestroy();\n this.quit = true;\n System.out.println("Service is Destroyed");\n}\n\n@Override\npublic void onRebind(Intent intent) \n{\n super.onRebind(intent);\n this.quit = true;\n System.out.println("Service is ReBinded");\n} \nRun Code Online (Sandbox Code Playgroud)\n\n}
\n\n然后是活动
\n\npublic class MainActivity extends Activity{\nButton bind , unbind , getServiceStatus;\nBindService.MyBinder binder;\n// define a ServiceConnection object\nprivate ServiceConnection conn = new ServiceConnection()\n{\n // then the Activity connected with the Service, this will be called\n @Override\n public void onServiceConnected(ComponentName name\n , IBinder service)\n {\n System.out.println("--Service Connected--");\n // achieve MyBinder instance\n binder = (BindService.MyBinder) service;\n }\n // then the connection break off\n @Override\n public void onServiceDisconnected(ComponentName name)\n {\n System.out.println("--Service Disconnected--"); \n }\n};\n@Override\npublic void onCreate(Bundle savedInstanceState)\n{\n super.onCreate(savedInstanceState);\n setContentView(R.layout.main);\n\n bind = (Button) findViewById(R.id.bind);\n unbind = (Button) findViewById(R.id.unbind);\n getServiceStatus = (Button) findViewById(R.id.getServiceStatus);\n\n final Intent intent = new Intent();\n\n intent.setAction("org.crazyit.service.BIND_SERVICE"); \n bind.setOnClickListener(new OnClickListener()\n {\n @Override\n public void onClick(View source)\n {\n //bind Serivce\n bindService(intent , conn , Service.BIND_AUTO_CREATE); \n }\n });\n unbind.setOnClickListener(new OnClickListener()\n {\n @Override\n public void onClick(View source)\n {\n //unbind Serivce\n unbindService(conn);\n }\n }); \n getServiceStatus.setOnClickListener(new OnClickListener()\n {\n @Override\n public void onClick(View source)\n {\n // Toast to show the conut value\n Toast.makeText(MainActivity.this\n , "Serivce\'s count value is\xef\xbc\x9a" + binder.getCount()\n , 4000)\n .show();\n }\n });\n}}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
10882 次 |
| 最近记录: |