사용자가 애플리케이션을 닫을 때 카운트 다운 타이머가 실행되지 않음

Madhav_nimavat

사용자가 응용 프로그램을 최소화하면 잘 작동하지만 사용자가 응용 프로그램을 닫으면 중지되는 시간 제한을 표시하기 위해 카운트 다운 타이머를 만들었습니다. 나는 아래 코드를 추가하여 비상 사태를 도와주었습니다.

이것은 MainActivity.java입니다.

public static final String TAG = "Demo";
    TextView t1 ;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        t1 = (TextView)findViewById(R.id.t1);
         startService(new Intent(this, count_servie.class));
    }
    private BroadcastReceiver br = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {            
            updateGUI(intent);
        }
    };
    public void onResume() {
        super.onResume();        
        registerReceiver(br, new IntentFilter(count_servie.COUNTDOWN_BR));
        }
    private void updateGUI(Intent intent) {
        if (intent.getExtras() != null) {
            long millisUntilFinished = intent.getLongExtra("countdown", 0);
            t1.setText("Countdown seconds remaining: " +  millisUntilFinished / 1000);
        }
    }

이것은 내 count_servie.java입니다.

public class count_servie extends Service {
    public static final String COUNTDOWN_BR = "com.demo.DSemo.countdown_br";
    Intent bi = new Intent(COUNTDOWN_BR);
    CountDownTimer cdt = null;
        public void onCreate() {       
            super.onCreate();
            cdt = new CountDownTimer(30000, 1000) {
                public void onTick(long millisUntilFinished) {
                    bi.putExtra("countdown", millisUntilFinished);
                    sendBroadcast(bi);
                }
                public void onFinish() {
                }
            };
            cdt.start();
        }
        public int onStartCommand(Intent intent, int flags, int startId) {   
            return super.onStartCommand(intent, flags, startId);
        }
        public IBinder onBind(Intent arg0) {       
            return null;
        }

미리 감사드립니다.

ik024

당신은 반환해야 START_STCKY당신의 onStartCommand()응용 프로그램이 종료 될 때 서비스도 실행하는 방법.

 ....
 public int onStartCommand(Intent intent, int flags, int startId) {   
     return START_STCKY;
 } 
 ....

서비스를 올바르게 구현하려면 링크를 참조하십시오 .

또는 SO 질문을 참조 할 수 있습니다 .

업데이트Foreground Service 서비스가 종료되는 것을 방지 하려면 a 사용하십시오 . 서비스를 Foreground로 만들려면 onStartCommand코드를 다음으로 바꿉니다.

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Intent notificationIntent = new Intent(this, MainActivity.class);

    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
            notificationIntent, 0);

    Notification notification = new NotificationCompat.Builder(this)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle("Timer")
            .setContentText("Doing some work...")
            .setContentIntent(pendingIntent).build();

    startForeground(1337, notification);

    cdt = new CountDownTimer(30000, 1000) {
        public void onTick(long millisUntilFinished) {

            bi.putExtra("countdown", millisUntilFinished);
            sendBroadcast(bi);
        }

        public void onFinish() {
            stopForeground(true);
        }
    };
    cdt.start();
    return START_STICKY;
}

Udpate 2 :Service and를 사용하여 카운터SharedPreferences

Actvity의 코드를 다음으로 바꿉니다.

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Handler;
import android.support.v4.os.ResultReceiver;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

import java.util.Calendar;
import java.util.Date;

public class MainActivity extends AppCompatActivity {

private static final String TAG = MainActivity.class.getSimpleName();
private static final String SHARED_PREF = "MyPref";
private final static int MAX_COUNTER = 30;

public static final String KEY_COUNTER_SECONDS = "seconds";
public static final String KEY_SAVED_COUNTER = "saved_counter";
public static final String KEY_SAVED_TIME_MILLI = "saved_time_milli";

MyResultReceiver mReceiver;
TextView mTvCounter;
SharedPreferences mSharedPref;
long mMaxCounterValueInSeconds = MAX_COUNTER;
long mCurCounterValue = 0;
boolean mShouldSaveValues;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mTvCounter = (TextView) findViewById(R.id.tv_counter);
    mReceiver = new MyResultReceiver(null);
    mSharedPref = getSharedPreferences(SHARED_PREF, Context.MODE_PRIVATE);
}

@Override
protected void onResume() {
    super.onResume();

    //register listener
    MyService.registerReceiver(mReceiver);

    //get values from shared pref
    long savedCounter = mSharedPref.getLong(KEY_SAVED_COUNTER, -1);
    long savedTime = mSharedPref.getLong(KEY_SAVED_TIME_MILLI, -1);

    //if -1 counter was running when app was closed, get saved values from shared pref
    if (savedTime != -1) {
        //elapsedTime is the time spent in seconds while the app was in background
        long elapsedTime = (getCurrentTimeInMilli() - savedTime)/1000; //convert to sec

        mCurCounterValue = savedCounter + elapsedTime;

        if(mCurCounterValue < MAX_COUNTER){
            //calculate current counter value from values retrieved from shared pref
            mMaxCounterValueInSeconds = MAX_COUNTER - mCurCounterValue;
            //start the value with updated max count value
            startService(mMaxCounterValueInSeconds);
        }else{
            mCurCounterValue = MAX_COUNTER;
        }
    }else{
        //if counter was not running, start the service with max count value = MAX_COUNTER
        startService(mMaxCounterValueInSeconds);
    }

    //update text view
    mTvCounter.setText("" + mCurCounterValue);
}

private void startService(long maxCounter){
    mShouldSaveValues = true;

    Intent intent = new Intent(this, MyService.class);
    Bundle bundle = new Bundle();
    bundle.putLong(KEY_COUNTER_SECONDS, maxCounter);
    intent.putExtras(bundle);
    startService(intent);
}
@Override
protected void onPause() {
    super.onPause();

    //stop the service
    stopService(new Intent(this, MyService.class));
    //unregister listener
    MyService.unregisterReceiver();

    if(mShouldSaveValues) {//save the values only when counter has started
        //save values in the shared preference
        SharedPreferences.Editor editor = mSharedPref.edit();
        Log.d(TAG, "saving counter: " + Long.parseLong(mTvCounter.getText().toString()));
        editor.putLong(KEY_SAVED_COUNTER, Long.parseLong(mTvCounter.getText().toString()));
        editor.putLong(KEY_SAVED_TIME_MILLI, getCurrentTimeInMilli());
        editor.apply();
    }
}

/**
 * This method returns current time in milli seconds
 *
 * @return time in milliseconds
 */
private long getCurrentTimeInMilli() {
    Calendar cal = Calendar.getInstance();
    Date date = cal.getTime();
    long timeInMilli = date.getTime();
    return timeInMilli;
}

/**
 * ResultReceiver is used to get values from MyService.class
 * It is registered in onResume() &
 * unregistered in onPause()
 */
class MyResultReceiver extends ResultReceiver {

    public MyResultReceiver(Handler handler) {
        super(handler);
    }

    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        super.onReceiveResult(resultCode, resultData);
        String strMilliFinished = resultData.getString(MyService.KEY_MSG);
        updateUI(Long.parseLong(strMilliFinished));
    }

    private void updateUI(final long milliFinished) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {

                mCurCounterValue++;
                mTvCounter.setText("" + mCurCounterValue);

                if(milliFinished == 0) {
                    //resetting counter values

                    mShouldSaveValues = false;
                    mMaxCounterValueInSeconds = MAX_COUNTER;
                    mCurCounterValue = 0;

                    SharedPreferences.Editor editor = mSharedPref.edit();
                    editor.putLong(KEY_SAVED_COUNTER, -1);
                    editor.putLong(KEY_SAVED_TIME_MILLI, -1);
                    editor.apply();

                }
            }
        });
    }
}
}

서비스 코드를 다음으로 바꿉니다.

import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.IBinder;
import android.support.v4.app.NotificationCompat;
import android.support.v4.os.ResultReceiver;
import android.util.Log;

public class MyService extends Service {

public static final String KEY_MSG = "msg";

CountDownTimer cdt = null;
private static ResultReceiver mReceiver;

public MyService() {
}

public static void registerReceiver(ResultReceiver receiver) {
    mReceiver = receiver;
}

public static void unregisterReceiver() {
    mReceiver = null;

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    Bundle bundle = intent.getExtras();
    long maxCounterValueInSeconds = bundle.getLong(MainActivity.KEY_COUNTER_SECONDS);
    long maxCounter = maxCounterValueInSeconds * 1000;
    cdt = new CountDownTimer(maxCounter, 1000) {
        public void onTick(long millisUntilFinished) {

            sendMessage(1, "" + millisUntilFinished);
        }

        public void onFinish() {
            sendMessage(1, "" + 0);
            stopSelf();
        }
    };
    cdt.start();
    return START_STICKY;
}

private void sendMessage(int resultCode, String message) {

    if (mReceiver != null) {
        Bundle bundle = new Bundle();
        bundle.putString(KEY_MSG, message);
        mReceiver.send(resultCode, bundle);
    }
}

@Override
public void onDestroy() {
    super.onDestroy();
    cdt.cancel();
}

@Override
public IBinder onBind(Intent intent) {
    throw new UnsupportedOperationException("Not yet implemented");
}
}

참고 : 내가 사용하고 ResultReceiver대신BroadcastReciver

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

카운트 다운 타이머가 중지되지 않음

분류에서Dev

카운트 다운 타이머는 분과 초가 0 일 때 시간을 줄이지 않습니다.

분류에서Dev

페이지가 닫힌 경우 JQuery 카운트 다운 타이머가 계산되지 않음

분류에서Dev

카운트 다운 타이머 카운터가 작동하지 않음

분류에서Dev

사용자 입력을 비활성화하지 않고 카운트 다운 타이머 추가

분류에서Dev

tkinter에서 카운트 다운 타이머가 업데이트되지 않음

분류에서Dev

Android Studio : 앱이 닫힐 때도 실행되는 카운트 다운 타이머

분류에서Dev

타이머가 올바르게 카운트 다운되지 않음

분류에서Dev

오류 : 자바 스크립트 카운트 다운 타이머가 카운트 다운하지 않습니다.

분류에서Dev

JQuery 카운트 다운 타이머가 카운트 다운되지 않습니다.

분류에서Dev

내 웹 사이트의 주요 애플리케이션을 실행할 때 보이지 않습니다.

분류에서Dev

모달을 열 때 문자 카운터가 업데이트되지 않음

분류에서Dev

PHP를 사용하는 카운트 다운 타이머, 작동하지 않음

분류에서Dev

카운트 다운 타이머가 작동하지 않습니다.

분류에서Dev

카운트 다운 타이머가 작동하지 않습니다.

분류에서Dev

분 / 초 카운트 다운 타이머가 작동하지 않습니까?

분류에서Dev

자바 스윙 게임에서 카운트 다운 타이머가 작동하지 않음 + JDialog / JOptionPane 재설정

분류에서Dev

카운트 다운 타이머를 사용할 때 앱이 중지됨

분류에서Dev

javafx 씬 빌더에서 적용되지만 애플리케이션을 실행할 때 적용되지 않는 스타일 시트

분류에서Dev

자바 스크립트에서 카운트 다운 타이머가 다시 시작되지 않도록 중지

분류에서Dev

브라우저 페이지 새로 고침 및 카운트 다운 타이머가 계속되지 않아야 할 때

분류에서Dev

사용자가 특정 애플리케이션을 열 때 내 애플리케이션 실행-Android

분류에서Dev

Vanilla JS 카운트 다운 타이머가 자동으로 실행됩니다.

분류에서Dev

카운트 다운이 끝난 후 카운트 다운 타이머가 자동으로 새로 고쳐지는 것을 중지하는 방법

분류에서Dev

타이머가 0으로 카운트 다운하면 양식이 제출되지 않습니다.

분류에서Dev

WooCommerce 단일 제품 페이지에서 제품 판매가 끝날 때까지 카운트 다운 타이머

분류에서Dev

Swift로 카운트 다운 애플리케이션을 만들려고하는데 몇 가지 문제가 있습니다.

분류에서Dev

Android 애플리케이션을 다시 열 때 마지막 카운터에서 계속

분류에서Dev

애플리케이션이 다시 실행될 때 로그 아웃 페이지에 머물고 싶습니다 (사용자가 로그 아웃 버튼을 누르지 않은 경우).

Related 관련 기사

  1. 1

    카운트 다운 타이머가 중지되지 않음

  2. 2

    카운트 다운 타이머는 분과 초가 0 일 때 시간을 줄이지 않습니다.

  3. 3

    페이지가 닫힌 경우 JQuery 카운트 다운 타이머가 계산되지 않음

  4. 4

    카운트 다운 타이머 카운터가 작동하지 않음

  5. 5

    사용자 입력을 비활성화하지 않고 카운트 다운 타이머 추가

  6. 6

    tkinter에서 카운트 다운 타이머가 업데이트되지 않음

  7. 7

    Android Studio : 앱이 닫힐 때도 실행되는 카운트 다운 타이머

  8. 8

    타이머가 올바르게 카운트 다운되지 않음

  9. 9

    오류 : 자바 스크립트 카운트 다운 타이머가 카운트 다운하지 않습니다.

  10. 10

    JQuery 카운트 다운 타이머가 카운트 다운되지 않습니다.

  11. 11

    내 웹 사이트의 주요 애플리케이션을 실행할 때 보이지 않습니다.

  12. 12

    모달을 열 때 문자 카운터가 업데이트되지 않음

  13. 13

    PHP를 사용하는 카운트 다운 타이머, 작동하지 않음

  14. 14

    카운트 다운 타이머가 작동하지 않습니다.

  15. 15

    카운트 다운 타이머가 작동하지 않습니다.

  16. 16

    분 / 초 카운트 다운 타이머가 작동하지 않습니까?

  17. 17

    자바 스윙 게임에서 카운트 다운 타이머가 작동하지 않음 + JDialog / JOptionPane 재설정

  18. 18

    카운트 다운 타이머를 사용할 때 앱이 중지됨

  19. 19

    javafx 씬 빌더에서 적용되지만 애플리케이션을 실행할 때 적용되지 않는 스타일 시트

  20. 20

    자바 스크립트에서 카운트 다운 타이머가 다시 시작되지 않도록 중지

  21. 21

    브라우저 페이지 새로 고침 및 카운트 다운 타이머가 계속되지 않아야 할 때

  22. 22

    사용자가 특정 애플리케이션을 열 때 내 애플리케이션 실행-Android

  23. 23

    Vanilla JS 카운트 다운 타이머가 자동으로 실행됩니다.

  24. 24

    카운트 다운이 끝난 후 카운트 다운 타이머가 자동으로 새로 고쳐지는 것을 중지하는 방법

  25. 25

    타이머가 0으로 카운트 다운하면 양식이 제출되지 않습니다.

  26. 26

    WooCommerce 단일 제품 페이지에서 제품 판매가 끝날 때까지 카운트 다운 타이머

  27. 27

    Swift로 카운트 다운 애플리케이션을 만들려고하는데 몇 가지 문제가 있습니다.

  28. 28

    Android 애플리케이션을 다시 열 때 마지막 카운터에서 계속

  29. 29

    애플리케이션이 다시 실행될 때 로그 아웃 페이지에 머물고 싶습니다 (사용자가 로그 아웃 버튼을 누르지 않은 경우).

뜨겁다태그

보관