2017-10-29 27 views
-2

일부 메소드를 실행했을 때, 시간에 의해 자동적으로 갱신 가능한 어플리케이션을 만들고 싶습니다. Handler를 사용하여 시간에 따라 자동으로 업데이트되도록했습니다. 시간이 지나면 데이터가 firebase로 업데이트됩니다. 앱이 닫히지 않아도 작동 할 수 있습니다. 하지만 내가 지정한 업데이트 시간 전에 응용 프로그램을 닫으면 처리기가 작동하지 않습니다. 응용 프로그램을 계속 실행하는 서비스를 사용했지만.Java로 어플리케이션이 닫혀 있어도, Handler를 항상 실행하는 방법

는 지금까지 내 코드입니다 :

public class MyService extends Service { 
    public MyService() { 
    } 

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

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     return super.onStartCommand(intent, flags, startId); 
    } 
} 

내가 당신의 도움이 필요하세요 Myservice.java

AutoUpdate.java

public class AutoUpdate extends AppCompatActivity { 
    TextView textDateTime; 
    TextView textcurrentDateTime; 
    DatabaseReference mDatabase; 

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

     String currentDate = DateFormat.getDateTimeInstance().format(new Date()); 
     textcurrentDateTime.setText(currentDate); 

     final Handler handler=new Handler(); 
     final Runnable updateTask=new Runnable() { 
      @Override 
      public void run() { 
       updateCurrentTimeToFirebase(); 
       handler.postDelayed(this,7000); 
       handler.removeCallbacks(this); 
      } 
     }; 

     handler.postDelayed(updateTask,7000); 
     startService(new Intent(this, MyService.class)); 
    } 

    public void updateCurrentTimeToFirebase() { 
     String currentDate = DateFormat.getDateTimeInstance().format(new Date()); 
     mDatabase = FirebaseDatabase.getInstance().getReference(); 
     String id = mDatabase.push().getKey(); 
     mDatabase.child("autoUpdate").child(id).child("updateTime").setValue(currentDate); 
    } 
} 

.. 감사합니다 많이 ..

+0

오히려 처리기를 사용하는 것보다, 실행하는 백그라운드 서비스를 사용 모든 시간 –

+0

서비스 사용시 onStartCommand()의 인스턴트 온타리오 응답 확인 onStart() –

답변

0

백그라운드 서비스를 만들고 있지만 모든 작업이 아직 완료되지 않았습니다. 전경 활동 G는

변경 코드는

AutoUpdate.class을 다음과 같이

public class AutoUpdate extends AppCompatActivity { 

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

     if (!isMyServiceRunning(MyService.class)) { 
      Intent intent = new Intent(AutoUpdate.this, MyService.class)); 
      startService(intent); 
     } 
    } 
    private boolean isMyServiceRunning(Class<?> serviceClass) { 
     ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
     for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
      if (serviceClass.getName().equals(service.service.getClassName())) { 
       return true; 
      } 
     } 
     return false; 
    } 
} 

MyService.class

public class MyService extends Service { 
    TextView textDateTime; 
    TextView textcurrentDateTime; 
    DatabaseReference mDatabase; 

    public MyService() { 

    } 

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

    public void onDestroy() { 
     Log.d("destroy", "onDestroy"); 
    } 

    @Override 
    public void onStart(Intent intent, int startid) { 
     //return super.onStartCommand(intent, flags, startId); 
     String currentDate = DateFormat.getDateTimeInstance().format(new Date()); 
     mDatabase = FirebaseDatabase.getInstance().getReference(); 
     textcurrentDateTime.setText(currentDate); 

     final Handler handler=new Handler(); 
     final Runnable updateTask=new Runnable() { 
      @Override 
      public void run() { 
       updateCurrentTimeToFirebase(); 
       handler.postDelayed(this,7000); 
       handler.removeCallbacks(this); 
      } 
     }; 

     handler.postDelayed(updateTask,7000); 
    } 
    public void updateCurrentTimeToFirebase() { 
     String currentDate = DateFormat.getDateTimeInstance().format(new Date()); 
     String id = mDatabase.push().getKey(); 
     mDatabase.child("autoUpdate").child(id).child("updateTime").setValue(currentDate); 
    } 
}