如何将定时器作为服务运行?

时间:2016-12-31 03:42:21

标签: android timer

我想在开关打开时24小时运行一个计时器,24小时后开关将关闭..

但问题是,如果活动关闭或按下后退按钮,计时器将被杀死!

经过一番研究后,我认为我需要将计时器作为服务运行吗?我该怎么办?

谢谢每一个人。

这是我的计时器:



 CountDownTimer timert = new CountDownTimer(86400000,1000) {

        public void onTick(long millisUntilFinished) {

            String TL =String.format(Locale.US ,"%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millisUntilFinished),
                    TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) % TimeUnit.HOURS.toMinutes(1),
                    TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) % TimeUnit.MINUTES.toSeconds(1));

            TimeLeft.setText(TL);

        }

        public void onFinish() {
            MainActivity.aSwitch.setChecked(false);
            creditText.setText("Toggle On To Start");
        }
    };




2 个答案:

答案 0 :(得分:2)

首先,后退按钮或关闭活动不会终止服务(除非服务已绑定但未启动)。然而,它会增加其资源被杀的可能性。

其次,服务不是长期计时器的正确方法。使用AlarmManager并设置警报。这样,即使您的服务被终止,它也会在计时器结束时由系统重新启动。

第三,你对该代码中的视图对象有静态引用吗?我甚至无法计算出一个坏主意的方式。在活动生命周期之外的任何内容都应触及视图。

答案 1 :(得分:0)

你也可以使用Handler这个..希望它有效

    final WeakHashMap<String,Marker> obj = new WeakHashMap<>();

    mRootRef.child("Coordinates/" + mRequestID)
    .addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {

            Coordinates coordinates = dataSnapshot.getValue(Coordinates.class);
            final String lat = coordinates.getLatitude();
            final String lng = coordinates.getLongitude();

            latLng1 = new LatLng(Double.valueOf(lat), Double.valueOf(lng));
            markerOptions = new MarkerOptions()
                    .position(latLng1);


            mapa.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng1, 15));
            mapa.animateCamera(CameraUpdateFactory.zoomTo(15), 2000, null);

            Marker marker = mapa.addMarker( markerOptions);
            marker.setSnippet(dataSnapshot.getKey());
            marker.showInfoWindow();

            // Here is where I create the unique marker identification
            obj.put(dataSnapshot.getKey(), marker);


        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {


              Coordinates coordinates = dataSnapshot.getValue(Coordinates.class);
         final String lat = coordinates.getLatitude();
         final String lng = coordinates.getLongitude();

         latLng1 = new LatLng(Double.valueOf(lat), Double.valueOf(lng));
         markerOptions = new MarkerOptions().position(latLng1);

         // Now, it's just needed to update its new position
         obj.get(dataSnapshot.getKey()).setPosition(latLng1);

         mapa.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng1, 15));
         mapa.animateCamera(CameraUpdateFactory.zoomTo(15), 2000, null);


        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

请记住您的public void countDownStart() { handler = new Handler(); runnable = new Runnable(){ @Override public void run(){ handler.postDelayed(this,1000); try { FestCountdownTimer timer = new FestCountdownTimer(00, 00, 9, 3, 01, 2017); new CountDownTimer(timer.getIntervalMillis(), 1000) { @Override public void onTick(long millisUntilFinished){ int days = (int) ((millisUntilFinished / 1000) / 86400); int hours = (int) (((millisUntilFinished / 1000) - (days * 86400)) / 3600); int minutes = (int) (((millisUntilFinished / 1000) - (days * 86400) - (hours * 3600)) / 60); int seconds = (int) ((millisUntilFinished / 1000) % 60); String countdown = String.format("%02dd %02dh %02dm %02ds", days, hours, minutes, seconds); txtTimerDay.setText("" + String.format("%02d", days)); txtTimerHour.setText("" + String.format("%02d", hours)); txtTimerMinute.setText("" + String.format("%02d", minutes)); txtTimerSecond.setText("" + String.format("%02d", seconds)); } @Override public void onFinish() { textViewGone(); MainActivity.aSwitch.setChecked(false); creditText.setText("Toggle On To Start"); } }.start(); } catch (Exception e) { e.printStackTrace(); } } }; handler.postDelayed(runnable, 1 * 1000); } ..月份从9 is Hours,3 is date,1 is Febraury Month

开始

FestCoutdownTimer类

0th Index

希望它可以帮助你..