如何在Android应用程序的后台进行网络请求?

问题描述:

我是一名初学者程序员,制作了一个简单的应用程序,它向api发送一个HTTP请求并获取一些信息。我希望应用程序继续这样做,并在每个小时自动更新一次。我已经成功地使用HttpURLConnection,一个扩展AsyncTaskLoader的Loader,以及一个Handler和Runnable,可以在固定的时间重新启动加载器。如何在Android应用程序的后台进行网络请求?

当应用程序处于前台时,此功能正常工作,但只要切换到其他应用程序或关闭屏幕,它就会停止工作。我尝试使用部分唤醒锁来保持应用程序正常运行,但尽管应用程序正在运行,但一旦它停止在前台,所有网络活动都会停止,并且我得到一个不活动的InputConnection

警告消息。有什么我可以做的,以保持这个连接活动时,应用程序在后台?

尝试使用服务。

服务

public class TimeService extends Service { 
     // constant 
     public static final long NOTIFY_INTERVAL = 10 * 1000; // 10 seconds 

     // run on another Thread to avoid crash 
     private Handler mHandler = new Handler(); 
     // timer handling 
     private Timer mTimer = null; 

     @Override 
     public IBinder onBind(Intent intent) { 
      return null; 
     } 

     @Override 
     public void onCreate() { 
      // cancel if already existed 
      if(mTimer != null) { 
       mTimer.cancel(); 
      } else { 
       // recreate new 
       mTimer = new Timer(); 
      } 
      // schedule task 
      mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 0, NOTIFY_INTERVAL); 
     } 

     class TimeDisplayTimerTask extends TimerTask { 

      @Override 
      public void run() { 
       // run on another thread 
       mHandler.post(new Runnable() { 

        @Override 
        public void run() { 
         // display toast 
         Toast.makeText(getApplicationContext(), getDateTime(), 
           Toast.LENGTH_SHORT).show(); 
        } 

       }); 
      } 

      private String getDateTime() { 
       // get date time in custom format 
       SimpleDateFormat sdf = new SimpleDateFormat("[yyyy/MM/dd - HH:mm:ss]"); 
       return sdf.format(new Date()); 
      } 

     } 

舱单

<application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/title_activity_main" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <service android:name=".TimeService"/> 
    </application> 

Main类

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     startService(new Intent(this, TimeService.class)); 
    } 

Source