【问题标题】:Android: Ping server in every 10 minutesAndroid:每 10 分钟 Ping 服务器
【发布时间】:2016-01-30 08:04:37
【问题描述】:

我需要每 10 分钟 ping 一次服务器(api 调用),如果我的应用程序在后台运行,api 调用应该可以工作。请建议我更好的选择。

现在我使用了服务,但是如果我的应用程序在后台(由于 GC 清除),它会在一段时间后完成。

如果应用程序在后台运行,如何避免 GC 清除。请帮帮我。

【问题讨论】:

  • 我已经创建了服务。但由于 GC 清除,它会在一段时间后停止。
  • 在您的服务中使用START_STICKY,一旦资源可用,您的服务将自动重启
  • @kapil thadani 如何每 10 分钟调用一次服务(通过使用 AlarmManager/TimerTask/Timer/Handler/)

标签: android service garbage-collection broadcastreceiver alarmmanager


【解决方案1】:

如果你想在被杀死后自动重启你的服务,请将服务设置为sticky。

@Override
public int onStartCommand(Intent intent, int flags, int startId) { 
    return START_STICKY;
}

【讨论】:

    【解决方案2】:

    您可以为此使用Handler。 Handler 允许您发送和处理与线程的 MessageQueue 关联的 Message 和 Runnable 对象。每个 Handler 实例都与单个线程和该线程的消息队列相关联。 Handler 有两个主要用途: (1) 安排消息和可运行文件在未来某个时间点执行; (2) 将要在与您自己的线程不同的线程上执行的操作排入队列。

    示例:

    private final static int TIMEINTERVAL = 600000; //10 minutes
    Handler mHandler;
    Runnable mHandlerTask = new Runnable()
     {
     @Override 
     public void run() {
          // call your api here.    
             ApiCall();
             mHandler.postDelayed(mHandlerTask, TIMEINTERVAL);
     }
    };
    
    private void startTask(){
       //run your Task 
         mHandlerTask.run(); 
    }
    
    private void stopTask()
    {
      // stop your Task
         mHandler.removeCallbacks(mHandlerTask);
    }
    

    您还可以使用AlarmManager 并从您的活动中设置一个重复警报,该警报将每 10 分钟调用一次接收器:

    AlarmManager alarmManager=(AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent i = new Intent(context, AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),600000,
                                                                      pendingIntent);
    

    广播接收者:

    public class Receiver extends BroadcastReceiver
    {   
    
    @Override
    public void onReceive(Context context, Intent intent)
     {   
      //Call your API
     }
    
     }
    

    在您的 Manifest.xml 中注册接收方

    <receiver
    android:name="com.YourPackage.AlarmReceiver"
    android:exported="false">
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      相关资源
      最近更新 更多