2

ウィッシャーが登録した誕生日の日付と時間に基づいて、誕生日のウィッシュを自動的に送信するアプリケーションを開発しています。私は、今日の日付のデータベースからレコードを取得して、毎分自動的にメッセージを送信する無限ループを持つスレッドを作成しました。

私のコードは通常のアクティビティで正しく実行されています。私はサービス内に配置したいので、このコードを配置してアプリケーションの起動時にサービスを呼び出す方法を教えてください。

これは私のコードです

// 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;
   }
4

2 に答える 2

2

まずTimer、Java で呼び出されるクラスがあります。それを使用してください。スレッドで実行される無限ループを記述しないでください。これは非常に厄介な方法であり、あらゆる種類の問題を引き起こす可能性があります。

ここでは、 にTimer実装されていServiceます。このコードを試すことから始めることができます。AlarmAndroidクラスもご覧になることをお勧めします。

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これを呼び出すことで開始できますstartService(new Intent(this, NotificationService.class));Activity

さらに、詳細については、これこのリンクを参照してください。

于 2013-06-12T10:21:21.313 に答える