在后台使用服务实现倒计时器

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.当我按下停止按钮时,它不会停止计数.

3h3*_*3h3 1

使用bindService(Intent service, ServiceConnection conn, int flag)绑定你的倒计时服务,然后在你的服务中,返回包含你的计数的活页夹,并且在你的活动中,实例化的ServiceConnection对象可以处理活页夹。AIDL也可以做到这一点,建议先看看如何绑定服务,希望可以帮助你。

\n\n

演示

\n\n
public 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}   \n
Run Code Online (Sandbox Code Playgroud)\n\n

}

\n\n

然后是活动

\n\n
public 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}}\n
Run Code Online (Sandbox Code Playgroud)\n