2

Wisher에 의해 등록 된 시간과 함께 생일 날짜를 기반으로 생일 소원을 자동으로 전송하는 응용 프로그램을 개발 중입니다. 저는 무한 루프를 가진 스레드를 만들었습니다.이 스레드는 오늘날의 날짜에 대한 Database의 레코드를 가져와 매분마다 자동으로 메시지를 보냅니다.백그라운드 서비스에서 스레드를 무한 루프로 배치하는 방법

정상적인 활동 상태에서 코드가 올바르게 실행되고 있습니다. SERVICE.so에이 코드를 배치하고 응용 프로그램 시작시 서비스를 호출하는 방법을 알려줍니다.

첫째 자바 Timer라는 클래스가 .. 스레드에서 실행 루프에 대한 끝없는 쓰지 마십시오 사용, 일을 아주 끈적 방법이, 즉 내 코드

// function to run thread 
void startThread() 
{ 
     Thread th=new Thread(){ 
      @Override 
      public void run(){ 
       // 
       try 
       { 
        for (;;) 
        { 
           runOnUiThread(new Runnable() { 
           @Override 
           public void run() { 
            try { 
             //Getting the system date          
             Calendar today=new GregorianCalendar();     
             SimpleDateFormat simdate=new SimpleDateFormat("yyyy-MM-dd");            
             SimpleDateFormat timeFormat=new SimpleDateFormat("hh:mm a");          
             String systemDate=simdate.format(today.getTime()); 
             String systemTime=timeFormat.format(today.getTime()); 

             // system process 

             minText.setText(systemTime); 

             control.open(); 
             ArrayList<UserPOJO> event=control.MyDatabaseRecords(systemDate);//get the records for system date 
             for(int i=0;i<event.size();i++) 
             { 
              String dbContactID=event.get(i).getContactID(); 
              String dbContactNumber=event.get(i).getContactNumber(); 
              String dbContactMessage=event.get(i).getContactMessageBody(); 
              String dbDate=event.get(i).getContactWishDate();  
              String dbTime=event.get(i).getContactWishTime();  


              String[] time=dbTime.split("[ \\:]"); 
              String myhr=time[0]; 
              String mymin=time[1]; 
              String aorp=time[2]; 
              String myDBhr=addZeroBeforeDate(myhr); 
                   // adding zero before time hour 
              String CurrentDBTime=myDBhr+":"+mymin+" "+aorp; 



              Toast.makeText(getApplicationContext(),"Searching.....", 300).show(); 

              //Toast.makeText(getApplicationContext(),"DB Time:"+CurrentDBTime+"System Time"+systemTime, 300).show(); 


              if((dbDate.equals(systemDate))&& (CurrentDBTime.equals(systemTime))) 
              {// 
               System.out.println("Message Send at:"+systemTime); 
               Toast.makeText(getApplicationContext(),"Message Sent to :"+dbContactNumber+"on System time:"+systemTime, 300).show(); 
               sendSMS(dbContactNumber, dbContactMessage);     

               //send.sendSMS(dbContactNumber, dbContactMessage); 
              } 
            } 

            } 
            catch(Exception e) 
            { 
             e.printStackTrace(); 
            } 
           } 
           }); 
           Thread.sleep(60000); 
           // Thread.sleep(20000); 
        // set the scan for 60 seconds 
        } 
       } 
       catch (InterruptedException e) { 
       } 

      } // run 
     }; 
    th.start(); 
} 

    // Add zero if it is 

    dateval<10 
    private static String addZeroBeforeDate(String datevalue) 
    { 
     String dval=datevalue; 

     for(int i=dval.length();i<2;i++) 
     { 
      dval="0"+dval; 
     } 

     return dval; 
    } 
+0

AlarmManager는 영구 for 루프에서 매분마다 데이터베이스를 쿼리하지 마십시오. 사용자의 배터리가 완전히 소모되는 데 오랜 시간이 걸리지 않습니다. – Boardy

답변

1

입니다 모든 유형의 문제를 일으킬 수 있습니다.

여기서 TimerService에 구현되어 있습니다. 이 코드를 사용하여 시작할 수 있습니다. 안드로이드 Alarm 클래스를 살펴 보시기 바랍니다.

public class SomeService extends Service { 
    private static final String TAG = SomeService.class.getSimpleName(); 
    private static final long UPDATE_INTERVAL = 1 * 15 * 1000; 
    private static final long DELAY_INTERVAL = 0; 

    private Timer timer; 

    public SomeService() { 
    } 

    public void onCreate() { 
     Log.d(TAG, "STARTING SERVICE"); 

     super.onCreate(); 

    } 

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

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

     timer.scheduleAtFixedRate(
        new TimerTask() { 
         public void run() { 
          //DO YOUR CODE 
         } 
        }, 
        DELAY_INTERVAL, 
        UPDATE_INTERVAL 
      ); 

     super.onStartCommand(intent, flags, startId); 

     return 0; 
    } 

    @Override 
    public void onDestroy() { 
     timer.cancel(); 

     super.onDestroy(); 
    } 
} 

당신은 당신의 Service 또한 추가 정보를 thisthis 링크 보면 당신의 시작 Activity

에서이 startService(new Intent(this, NotificationService.class));를 호출하여 시작할 수 있습니다. 당신에 대한 UI를 차단 걱정하지 않아도 IntentService의 onHandleIntent() 방법은 다른 스레드에서 호출

:

+1

응답을 주셔서 감사합니다 Neil하지만 코드가 자동으로 닫히는 응용 프로그램을 닫으면 코드가 바뀌 었습니다. 빈 응용 프로그램을 열어도 응용 프로그램이 열리지 않습니다. ' –

+0

어떤 오류가 발생하고 있습니까? – Neil

+1

불행히도 응용 프로그램이 중지되었습니다 –

3

는 주기적으로 서비스를 호출 할 AlarmManager와 함께 IntentService을 사용해야합니다.

AlarmManagerTimerTask보다 효율적이어야합니다.

public class MyService extends IntentService { 

    private AlarmManager alarmManager; 

    private boolean started; 
    private PendingIntent pendingIntent; 

    public MyService() { 
     super(MyService.class.getSimpleName()); 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     alarmManager = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     if (! started) { 
      started = true; 

      // Call the service periodically every 15 minutes 
      pendingIntent = PendingIntent.getService(
        getApplicationContext(), 
        0, 
        intent, 
        PendingIntent.FLAG_UPDATE_CURRENT); 

      alarmManager.setRepeating(
        AlarmManager.ELAPSED_REALTIME, 
        AlarmManager.INTERVAL_FIFTEEN_MINUTES, 
        AlarmManager.INTERVAL_FIFTEEN_MINUTES, 
        pendingIntent); 
     } 

     // DO YOUR STUFF HERE 
    } 
} 

당신이 사용할 수있는 옵션에 대한 AlarmManager documention에서보세요 ( Timer Task VS Alarm Manager usage in Android Service 참조).

+0

이됩니다. 답변을 향상시킬 수 있습니까? – Iero

+0

사실, AlarmManager는 onCreate() 메소드에서 초기화되어야합니다. 그에 따라 대답을 업데이트 할 것입니다. – nicopico

+0

현재 작업에서 답을 사용하십시오. D – Iero

관련 문제