如何在Android中运行后台活动

时间:2011-11-10 09:44:08

标签: android android-activity alarmmanager

在我的应用程序中,我需要在一定的时间间隔后向用户发送短信。为此,我需要在后台运行发送代码的消息。我正在使用闹钟管理器在特定时间开始活动。怎么办?还有另一种方法吗?

5 个答案:

答案 0 :(得分:22)

您可以考虑使用基本无UI活动的Services

答案 1 :(得分:2)

对于那些想要使用Activity而不是使用服务的人(可能存在必要的情况),我通过以常规方式启动Activity,然后在Activity' s onCreate我通过调用moveTaskToBack(true)将它发送到后台。

请参阅Sending a running application to background programmatically

如果您使用此方法,则应该为启动Activity的意图添加额外信息,以便它在onCreate中知道它必须将自己发送到后台。您可以通过调用Intent的putExtra方法来完成此操作。在Activity的onCreate中,你可以使用getIntent获取调用Intent,然后使用getStringExtra检索你放在那里的信息(我使用了一个字符串额外信息)。请参阅Intent类的文档。

更新于8月2018:但请注意,在某些设备上,这可以使您的活动在发送到后台之前在屏幕上闪烁(即,短暂显示)。看起来系统会将通知视为过晚发送任务到后台。如果在onCreate中调用该方法,则在绘制“活动”窗口之前应该有足够的时间来了解它。 IMO这是一个系统缺陷,不应该这样发生,但确实如此 所以,无论如何,如果这是一个问题,如果可以的话,你可能最好用服务来做。

答案 2 :(得分:0)

是的。你应该使用Service来实现这一点。他们可以在后台运行直到明确关闭。 IntentService是另一种选择

http://developer.android.com/guide/topics/fundamentals/services.html

答案 3 :(得分:0)

这可能会有所帮助.. 将其添加到android manifest ..:

uses-permission android:name =“android.permission.ACCESS_BACKGROUND_SERVICE”

也可以使用AsyncClass进行长/后台处理。就像这样。:

http://developer.android.com/reference/android/os/AsyncTask.html

答案 4 :(得分:0)

建议使用服务来实现这一目标,但是当需要来自其他应用程序的内容时,我遇到了类似的情况 - 并且未导出服务的意图,因此启动服务的唯一方法是启动活动 - 并将用户留在我的应用程序中,我需要将我的活动保持在前台。 在这种情况下,可以在AsyncTask中启动其他活动,然后在onPostExecute重启自己。

    (new AsyncTask<Void, Void, Void>() {
        boolean starting = false;
        @Override
        protected Void doInBackground(Void... params) {
            if(!externalServiceRunning()){
                Intent externalIntent = getPackageManager().getLaunchIntentForPackage("com.external...");
                if (externalIntent != null) {
                    starting = true;
                    startActivity(externalIntent);
                }
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            if(starting) {
                Intent myApp = getPackageManager().getLaunchIntentForPackage("com.my.myapp");
                if (myApp != null) {
                    startActivity(myApp);
                }
            }
        }
    }).execute();