如何将活动设置为始终处于活动状态?

时间:2012-02-12 10:20:15

标签: java android

我的活动一直需要活跃。我有一个睡眠10秒的线程,并监视从数据库中获取的值,比较它们和启动方法。我想知道用户是否回到其他应用程序和活动,我的活动和线程是否仍然有效,或者它们是由活动管理器处理并转到pause-stop-destroy?如何让他们活着? 谢谢。 这是该线程的代码:

 new Thread(new Runnable() {

        public void run() {
            // TODO Auto-generated method stub
            while(true){
                try {
                    Thread.sleep(10000);
                    myHendler.post(new Runnable() {

                        public void run() {
                            // TODO Auto-generated method stub

                            final Calendar cal = Calendar.getInstance();
                            int godina2 = cal.get(Calendar.YEAR);
                            int mesec2 = cal.get(Calendar.MONTH);
                            int dan2 = cal.get(Calendar.DAY_OF_MONTH);
                            int sati2 = cal.get(Calendar.HOUR_OF_DAY);
                            int minuti2 = cal.get(Calendar.MINUTE);

                            trenutniDatum = new StringBuilder().append(dan2).append("-").append(mesec2 +1).append("-").append(godina2);
                            trenutnoVreme = prepraviVreme(sati2) + ":" + prepraviVreme(minuti2);
                            for(int i = 0; i < primljenoIzBazeDatum.length; i++){
                                String bazaBroj = "";
                                String bazaText = "";
                                if(primljenoIzBazeDatum[i].toString().equals(trenutniDatum.toString()) && primljenoIzBazeVreme[i].toString().equals(trenutnoVreme)){

                                        int bazaId = Integer.parseInt(primljenoIzBazeId[i]);
                                        bazaBroj = primljenoIzBazeBroj[i].toString();
                                        bazaText = primljenoIzBazeText[i].toString();
                                        String datumPromena = "*" + primljenoIzBazeDatum[i].toString() + "* SENT *";

                                        datumVreme.open();
                                        datumVreme.updateData(bazaId, datumPromena);
                                        datumVreme.close();

                                        sendPoruka(bazaBroj, bazaText);

                                }

                            } // end for


                        } // end run
                    });
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }).start();

4 个答案:

答案 0 :(得分:6)

根据我对你想做什么的理解,我会做的是:

首先,创建一个BroadcastReceiver

public class Poller extends BroadcastReceiver {
    private final String TAG = "Poller";
    @Override
    public void onReceive( Context context, Intent intent ) {
    Log.i(TAG, "Poller broadcastintent received");
    Intent myIntent = new Intent( context, PollerService.class );
    context.startService( myIntent );
}

然后,创建被调用的服务,然后自行关闭

public class PollerService extends Service {
    final String TAG = "PollerService";
    @Override
    public void onStart(Intent intent, int startId) {
    Log.i(TAG, "Service onStart()");
    pollingTask.execute();
}

AsyncTask<Void, Void, Void> pollingTask = new AsyncTask<Void, Void, Void>() {
    @Override
    protected Void doInBackground(Void... param) {
        // Do what you want in the background
    }

    @Override
    protected void onPostExecute(Void result) {
        stopSelf();
    }
};
}

然后,设置AlarmManager以每分钟唤醒服务

AlarmManager am = ( AlarmManager ) getSystemService( Context.ALARM_SERVICE );
Intent alarmIntent = new Intent( "CHECK_DATABASE" );
PendingIntent pi = PendingIntent.getBroadcast(context, 0 , alarmIntent, 0 );
int type = AlarmManager.ELAPSED_REALTIME_WAKEUP;
long interval = POLLING_INTERVAL_IN_MILLISECONDS;
long triggerTime = SystemClock.elapsedRealtime() + interval;
// For short intervals setInexact repeating is same as exactRepeating, use at least fifteen minutes to make it more efficient
am.setInexactRepeating( type, triggerTime, interval, pi );
Log.i(TAG, "Set inexact alarm through AlarmManager");
}

在Android清单中设置接收器

<receiver android:name="Poller">
    <intent-filter>
        <action android:name="CHECK_DATABASE"/>
    </intent-filter>
</receiver>

最后,取消设置收到所需短信后停止轮询的AlarmManager

AlarmManager am = ( AlarmManager ) getSystemService( Context.ALARM_SERVICE );
Intent intent = new Intent( "CHECK_DATABASE" );
PendingIntent pi = PendingIntent.getBroadcast( context, 0 , intent, 0 );
am.cancel(pi);

我确实认为彼得是正确的,除非你只是检查,直到你得到所需的信息,然后不进行民意调查,这将会扼杀你的电池。

此外,如果您可以通过数据库中的单个调用获得发送SMS的确切时间,您可以设置AlarmManger以在此时唤醒服务,执行操作并完成操作。那将是最好的方法(如果您的代码就是这种情况,我无法理解,但它似乎确实来自您的评论)。

答案 1 :(得分:3)

不,Android上的应用程序代码无法保证始终运行。 Android操作系统可以在任何需要的时候终止应用程序和服务。

定期执行代码的最佳选择是使用AlarmManager,这会使您的代码定期执行。还必须设置正确的标志,以便在设备处于睡眠状态时执行代码。

注意,由于你的时间非常短(10秒),它会让CPU一直在运行,很快就会耗尽电池。

答案 2 :(得分:0)

如果必须一直处于活动状态,则必须使用服务:http://developer.android.com/guide/topics/fundamentals/services.html

  

我想知道用户是否回到其他应用程序和活动,   我的活动和线程是否仍然有效,或者它们是由...处理的   活动经理,然后去暂停 - 停止 - 破坏?如何留住他们   住??

他们不会被“活着”。如果系统需要资源,则会破坏您的活动。如果您希望在应用程序完成后仍然在后台运行,则必须使用服务。

答案 3 :(得分:0)

在Java语言中,您可以通过传统方式安排程序:

java.util.Timer
java.util.TimerTask

有关详细信息,请参阅:

  1. http://enos.itcollege.ee/~jpoial/docs/tutorial/essential/threads/timer.html
  2. http://www.ibm.com/developerworks/java/library/j-schedule/index.html
  3. 但更好的做法是使用Quartz之类的调度框架,你可以看到http://www.quartz-scheduler.org/。 Spring框架还与Quartz框架集成。