【问题标题】:Start Android Service after every 5 minutes每 5 分钟启动一次 Android 服务
【发布时间】:2020-04-14 07:33:25
【问题描述】:

过去 2 天我一直在互联网上搜索,但找不到任何有用的教程。我已经创建了一项服务,并在服务启动时在状态栏中发送通知。我希望该服务在显示通知后停止,并在 5 分钟后重新启动。如果可能,请告诉我,如果您有任何有用的教程,请告诉我。我听说过TimerTaskAlarmManager,我也尝试使用它们,但我无法获得想要的结果。

编辑:即使我的应用程序没有运行,我也需要每 5 分钟启动一次服务。

【问题讨论】:

    标签: android service alarmmanager timertask


    【解决方案1】:

    您不想使用TimerTask,因为这取决于您的应用程序是否连续运行。 AlarmManager 实现使您的应用程序可以安全地在执行之间被终止。

    声明您尝试使用AlarmManager 但没有得到想要的结果并不是一个有用的声明,因为它不会告诉任何人如何帮助您获得正确的结果。表达所发生的事情会更有用。

    http://web.archive.org/web/20170713001201/http://code4reference.com/2012/07/tutorial-on-android-alarmmanager/ 包含似乎对AlarmManager 有用的教程。以下是重点:

    1) 您的警报将在 Intent 到期时触发。由您决定使用哪种Intent 以及应该如何实施。我提供的链接有一个基于 BroadcastReceiver 的完整示例。

    2) 您可以通过以下示例安装闹钟:

    public void setOnetimeTimer(Context context) {
        AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
        intent.putExtra(ONE_TIME, Boolean.TRUE);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
        am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (1000 * 60 * 5), pi);
    }
    

    【讨论】:

    • 不错的方法,真的。你应该这样使用AlarmManager;Calendar wakeUpTime = Calendar.getInstance(); wakeUpTime.add(Calendar.SECOND, seconds); AlarmManager aMgr = (AlarmManager) getSystemService(ALARM_SERVICE); aMgr.set(AlarmManager.RTC_WAKEUP, wakeUpTime.getTimeInMillis(), pendingIntent);
    • 我将 AlarmManager 用于相同目的。我在 AlarmManager 中设置了 2 分钟。但是 AlarmManager 是随机触发的。我认为这不是使用 AlarmManager 每 2 分钟调用一次的最佳方式。
    • @mah 即使应用程序进入后台,我也可以在后台每 5 秒发送一次位置吗?在我的应用程序中,10 分钟后停止在后台发送位置,我正在使用计时器。
    【解决方案2】:

    下面我提供了三个文件,MainActivity.java 用于启动服务,第二个文件 MyService.java 提供 5 分钟服务,第三个是清单文件。

    MainActivity.java

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            startService(new Intent(this, MyService.class)); //start service which is MyService.java
        }
    }
    

    MyService.java

     public class MyService extends Service {
    
        public static final int notify = 300000;  //interval between two services(Here Service run every 5 Minute)
        private Handler mHandler = new Handler();   //run on another Thread to avoid crash
        private Timer mTimer = null;    //timer handling
    
        @Override
        public IBinder onBind(Intent intent) {
            throw new UnsupportedOperationException("Not yet implemented");
        }
    
        @Override
        public void onCreate() {
            if (mTimer != null) // Cancel if already existed
                mTimer.cancel();
            else
                mTimer = new Timer();   //recreate new
            mTimer.scheduleAtFixedRate(new TimeDisplay(), 0, notify);   //Schedule task
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            mTimer.cancel();    //For Cancel Timer
            Toast.makeText(this, "Service is Destroyed", Toast.LENGTH_SHORT).show();
        }
    
        //class TimeDisplay for handling task
        class TimeDisplay extends TimerTask {
            @Override
            public void run() {
                // run on another thread
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        // display toast
                        Toast.makeText(MyService.this, "Service is running", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        }
    }
    

    AndroidManifest.xml

      <service android:name=".MyService" android:enabled="true" android:exported="true"></service>
    

    【讨论】:

    • 服务完成后我想在没有用户输入的情况下五分钟后再次执行服务怎么办?
    • @KULKING 即使我也想知道,如果您找到任何解决方案,请告诉我
    • @Khyati Fatania 应用程序被杀死时会发生什么?目前此代码在应用程序中运行是前台和后台。
    【解决方案3】:

    创建一个Timer 对象并给它一个TimerTask 来执行您想要执行的代码。

    Timer timer = new Timer ();
    TimerTask hourlyTask = new TimerTask () {
        @Override
        public void run () {
            // your code here...
        }
    };
    
    // schedule the task to run starting now and then every hour...
    timer.schedule (hourlyTask, 0l, 1000*60*60);   // 1000*10*60 every 10 minut
    

    使用 Timer 对象的好处是它可以处理多个 TimerTask 对象,每个对象都有自己的计时、延迟等。你也可以启动和停止定时器,只要你通过声明它来持有 Timer 对象作为类变量或其他东西。

    【讨论】:

    • 投反对票; Timer 绝对是一个糟糕的解决方案,因为 Android 可以终止应用程序,如果您使用 Timer 或 TimerTask,则无法处理它。这不是“工作代码”,而是“仅在理想条件下工作”的代码。
    • 同意@mah,我还看到一些cmets在一些问题上反对计时器。顺便说一句,我感谢 Nirav Ranpara 的参与。你能提供一个AlarmManager的解决方案吗?
    • 我很遗憾地提到,即使我的应用程序没有运行,我也希望此服务每 5 分钟启动一次。我也编辑了这个问题。
    • @mah:好的。你能告诉我怎么做吗?
    • @NiravRanpara 请查看我的答案,以及它链接到的教程以获取更多详细信息的来源。请注意,谷歌搜索“alarmmanager tutorial”会找到几个额外的教程,我只选择了列出的第一个。
    猜你喜欢
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 2013-10-19
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多