2016-08-15 2 views
0

사용자가 초를 입력하고 버튼을 누르면 화면이 꺼지고 타이머가 시작되는 응용 프로그램이 있습니다 (입력 된 초 수와 함께). 화면이 켜지고 타이머가 끝난 후에 만 ​​서비스가 중지됩니다.서비스를 통해 UI 업데이트를 중지하는 방법은 무엇입니까?

이제 타이머가 끝나면 TextView를 변경해야합니다. 현재, MainService에서 변수를 (counterr; MainService에서 보시오.) 5 초 후에 계속 증가 시키지만 (mainService에서 "sendUpdatesToUI"함수 참조), 변수가 한 번만 증가하고 서비스가 중단 된 후에 만 ​​변수를 증가 시키길 원합니다.

아이디어는 어떻게됩니까?

MainActivity :

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final EditText timer = (EditText) findViewById(R.id.insertTimer); 

     findViewById(R.id.startApp).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(MainActivity.this, MainService.class); 
       intent.putExtra("timer", timer.getText().toString()); 
       registerReceiver(broadcastReceiver, new IntentFilter(MainService.BROADCAST_ACTION)); 

       Toast.makeText(MainActivity.this, "Countdown, Started", Toast.LENGTH_SHORT).show(); 
       Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, 1000); 

       startService(intent); 
      } 
     }); 
    } 

    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      updateUI(intent); 
     } 
    }; 

    private void updateUI(Intent intent) { 
     String counter = intent.getStringExtra("counter"); 
     TextView txtCounter = (TextView) findViewById(R.id.txtCounter); 
     txtCounter.setText(counter); 
    } 
} 

MainService :

public class MainService extends Service { 

    public static final String BROADCAST_ACTION = "package com.example.vladpintea.friendsbeforecents.displayevent"; 
    private final Handler handler = new Handler(); 
    Intent intent; 
    int counterr = 0; 

    String usedTimer; 
    long interval; 

    //TimerTask that will cause the run() runnable to happen. 
    TimerTask myTask = new TimerTask() { 
     public void run() { 
      stopSelf(); 
     } 
    }; 
    //Timer that will make the runnable run. 
    Timer myTimer = new Timer(); 

    private boolean isRunning = false; 

    @Override 
    public void onCreate() { 
     intent = new Intent(BROADCAST_ACTION); 

     registerReceiver(counter, new IntentFilter(Intent.ACTION_SCREEN_ON)); 

     Toast.makeText(MainService.this, "Service, Created", Toast.LENGTH_SHORT).show(); 

     isRunning = true; 
    } 

    private BroadcastReceiver counter = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      Toast.makeText(MainService.this, "Whoops! You've Lost.", Toast.LENGTH_SHORT).show(); 
      Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, 30000); 
     } 
    }; 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     usedTimer = intent.getStringExtra("timer"); 
     try { 
      interval = Long.parseLong(usedTimer); 
     } catch (NumberFormatException nfe) { 

     } 

     handler.removeCallbacks(sendUpdatesToUI); 
     handler.postDelayed(sendUpdatesToUI, 1000); // 1 second 

     Toast.makeText(MainService.this, "Service, Started", Toast.LENGTH_SHORT).show(); 

     myTimer.schedule(myTask, interval); 
     return super.onStartCommand(intent, flags, startId); 
    } 

    private Runnable sendUpdatesToUI = new Runnable() { 
     public void run() { 
      DisplayLoggingInfo(); 
      handler.postDelayed(this, 5000); 
     } 
    }; 

    private void DisplayLoggingInfo() { 
     intent.putExtra("counter", String.valueOf(++counterr)); 
     sendBroadcast(intent); 
    } 

    @Override 
    public void onDestroy() { 
     PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK 
       | PowerManager.ACQUIRE_CAUSES_WAKEUP 
       | PowerManager.ON_AFTER_RELEASE, "MyWakeLock"); 
     wakeLock.acquire(); 

     Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, 30000); 

     android.os.Process.killProcess(android.os.Process.myPid()); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 
} 

답변

1

전화 DisplayLoggingInfo()에만들의 OnDestroy()에서 한 번만 카운터를 늘리려면.

+0

감사합니다. 매력처럼 일했습니다. –

관련 문제