【问题标题】:Figuring out alarm manager找出警报管理器
【发布时间】:2013-04-28 01:34:25
【问题描述】:

我正在尝试创建一个应用程序,该应用程序将在 x 分钟后将一些数据发送到网络服务器。有人告诉我,警报管理器将是最好的解决方案,只需在警报中调用相同的警报函数,并在警报中增加 x 分钟,这样即使在后台也能不断发送数据。

但是,我只在项目中看到警报打开意图。这是否意味着它将在 x 分钟后切换到新意图,或者一切都会在后台运行?

应该发送后台数据而不必在意图之间切换,所以我希望它只在我的一个活动中调用一个函数。我该怎么做呢?

这是我想每 x 分钟调用一次的函数。

谢谢

public class updateloc extends AsyncTask<Void, Void, Void> {

    protected void onPostExecute(String response) {
        if (response != null) {
            // check if this does anything later
        }
        progressDialog.dismiss();
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressDialog = ProgressDialog.show(ImTracking.this, "",
                "Updating Data...");
    }

    @Override
    protected Void doInBackground(Void... arg0) {
        SharedPreferences prefs = getSharedPreferences("Settings", 0);
        final String id = prefs.getString("ID", "");
        DefaultHttpClient httpclient = new DefaultHttpClient();
        HttpPost httpost = new HttpPost(
                "http://iphone-radar.com/gps/gps_locations");

        JSONObject holder = new JSONObject();

        try {
            holder.put("id", id);
            LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
            Criteria criteria = new Criteria();
            criteria.setAccuracy(Criteria.ACCURACY_FINE);
            String bestProvider = locationManager.getBestProvider(criteria,
                    false);
            LocationListener loc_listener = new LocationListener() {

                @Override
                public void onStatusChanged(String provider, int status,
                        Bundle extras) {
                }
            };
            try {
                Looper.prepare();
                locationManager.requestLocationUpdates(bestProvider, 0, 0,
                        loc_listener);
            } catch (Exception e) {
                e.printStackTrace();
            }
            Location location = locationManager
                    .getLastKnownLocation(bestProvider);
            Calendar c = Calendar.getInstance();
            SimpleDateFormat sdf = new SimpleDateFormat(
                    "hh:mmaa MM/dd/yyyy");
            holder.put("time", sdf.format(c.getTime()));
            holder.put("time_since_epoch", System.currentTimeMillis());
            try {
                holder.put("lat", location.getLatitude());
                holder.put("lon", location.getLongitude());
            } catch (NullPointerException e) {
                try {
                    holder.put("lat", -1.0);
                    holder.put("lon", -1.0);
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }
            }

            StringEntity se = new StringEntity(holder.toString());
            httpost.setEntity(se);
            httpost.setHeader("Accept", "application/json");
            httpost.setHeader("Content-type", "application/json");

            ResponseHandler responseHandler = new BasicResponseHandler();
            String response = httpclient.execute(httpost, responseHandler);
            org.json.JSONObject obj;

            obj = new org.json.JSONObject(response);

        } catch (JSONException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        progressDialog.dismiss();
        return null;
    }
}

【问题讨论】:

  • 查看 http://stackoverflow.com/questions/16128091/setting-up-alarm-manager-is-creating-2-instances-of-my-main-activity/16134932#16134932 它对我有用。

标签: android alarm


【解决方案1】:

如果您希望它在后台运行,您需要创建一个服务。可以使用意图启动服务,因此您可以使用 AlarmManager 启动服务。看看IntentService,你只需要在服务的handleIntent() 方法中移动你当前在AsyncTask 中所做的事情。

【讨论】:

  • 因此,如果我使用新的意图服务,我会创建一个新类并扩展意图服务并实现 onHandleIntent,然后将我的信息放在那里并每次都从我的原始活动中调用意图吗?
  • 是的,你需要扩展IntentService并实现onHandleIntent()。我不知道您的 Activity 是如何工作的,但是如果您需要,您也可以从那里获得所有服务(除了安排使用 AlarmMaanger 定期运行)。
猜你喜欢
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
相关资源
最近更新 更多