gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:41:27 25 4
gpt4 key购买 nike

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

我的代码在正常 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com