android - 如何在后台服务中放置带有无限循环的线程

标签 android android-layout android-intent android-emulator android-sqlite

我正在开发应用程序,该应用程序将根据祝愿者注册的生日日期和时间自动发送生日祝福。 我创建了一个带有无限 for 循环的线程,它将从数据库中获取今天日期的记录,以便每分钟自动发送消息。

我的代码在正常 Activity 中正常运行。我想放在 SERVICE 中。所以请帮助我如何放置此代码并在应用程序启动时调用服务。

这是我的代码

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

最佳答案

您应该使用 IntentServiceAlarmManager定期调用该服务:

IntentService的onHandleIntent()方法是在不同的线程中调用的,所以你不必担心阻塞UI。

AlarmManager 也应该比 TimerTask 更高效。 (参见Timer Task VS Alarm Manager usage in Android Service)

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了解您可以使用的选项。

关于android - 如何在后台服务中放置带有无限循环的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17062523/

相关文章:

c# - Java Android 监听器

android - 如何在 Android 中以编程方式替换 View ?

android - 从包中获取字符串时出现 "readBundle: bad magic number"错误

android - 无法从 Android M 中的 URI 获取文件路径

android - 在固定时间间隔后调用特定方法

android - 在 libgdx 游戏中添加一个 "rate my app"按钮

java - 安装 Android Studio 不会安装 Android SDK

Android 键盘输入/下一步按钮处理程序

java - Android Viewpager 项目访问

android - 检查是否有应用程序在监听我的 Intent