Android无需按下按钮即可向服务器发送Gps数据

Android无需按下按钮即可向服务器发送Gps数据,android,gps,Android,Gps,目前,我有一个类,可以在按下按钮时将数据发送到服务器,我希望自动化此服务,使其每4小时将数据发送到服务器,而无需按下按钮。邮政服务目前正在后台工作,有什么提示吗??我必须实现一个计时器吗?不知道它在我的领域之外??提前谢谢 Button btnCreateUser = (Button) findViewById(R.id.btnSend); // button click event btnCreateUser.setOnClickListener(new View.OnCl

目前,我有一个类,可以在按下按钮时将数据发送到服务器,我希望自动化此服务,使其每4小时将数据发送到服务器,而无需按下按钮。邮政服务目前正在后台工作,有什么提示吗??我必须实现一个计时器吗?不知道它在我的领域之外??提前谢谢

  Button btnCreateUser = (Button) findViewById(R.id.btnSend);
    // button click event
    btnCreateUser.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            // creating new product in background thread
                new CreateNewUser().execute();
            }
    });
}

class CreateNewUser extends AsyncTask<String, String, String> {
    @Override
    protected String doInBackground(String... args)  {
        String lat=latitude, lng=longitude;
        SimpleDateFormat sdfDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
        String newtime =  sdfDateTime.format(new Date(System.currentTimeMillis()));
        EditText username = (EditText) findViewById(R.id.myText); 
        String newString= (String)username.getText().toString();
        String created_at=newtime;
        String timezone="UTC";
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(url_create_user);
        String responseBody = "";
        HttpResponse response = null;

        try {

            String base64EncodedCredentials = "Basic " + Base64.encodeToString( 
          (username + ":" + created_at +":"+timezone+":"+lat+":"+lng).getBytes(), 
                    Base64.NO_WRAP);

            httppost.setHeader("Authorization", base64EncodedCredentials);
            httppost.setHeader(HTTP.CONTENT_TYPE,"application/json");
            JSONObject obj = new JSONObject();
            obj.put("username", String.valueOf(newString)); 
            obj.put("created_at",String.valueOf(newtime));
            obj.put("timezone", String.valueOf(timezone));
            obj.put("lat", String.valueOf(latitude));
            obj.put("lng", String.valueOf(longitude));
            httppost.setEntity(new StringEntity(obj.toString(), "UTF-8"));

            // Execute HTTP Post Request
            response = httpclient.execute(httppost);

            if (response.getStatusLine().getStatusCode() == 200) {

                Log.d("response ok", "Reached Server ok");
                 startActivity(new Intent("com.xxxxx.CLEARSCREEN"));

            } else {
                Log.d("response not ok", "Something went wrong :/");
            }
            responseBody = EntityUtils.toString(response.getEntity());

        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        catch (JSONException e) {
           e.printStackTrace();
        }
        return responseBody;
    }
Button btnCreateUser=(Button)findviewbyd(R.id.btnSend);
//按钮点击事件
btnCreateUser.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图){
//在后台线程中创建新产品
新建CreateNewUser().execute();
}
});
}
类CreateNewUser扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…args){
字符串纬度=纬度,lng=经度;
SimpleDateFormat sdfDateTime=新的SimpleDateFormat(“yyyy-MM-dd HH:MM:ss”,Locale.US);
字符串newtime=sdfDateTime.format(新日期(System.currentTimeMillis());
EditText用户名=(EditText)findViewById(R.id.myText);
字符串newString=(字符串)username.getText().toString();
在=newtime时创建的字符串;
字符串时区=“UTC”;
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(url\u创建\u用户);
字符串responseBody=“”;
HttpResponse响应=null;
试一试{
字符串base64EncodedCredentials=“Basic”+Base64.encodeToString(
(用户名+”:“+在+”:“+时区+”:“+lat+”:“+lng).getBytes(),
Base64.无包装);
httppost.setHeader(“授权”,base64EncodedCredentials);
setHeader(HTTP.CONTENT_类型,“application/json”);
JSONObject obj=新的JSONObject();
obj.put(“用户名”,String.valueOf(newString));
obj.put(“在创建时”,String.valueOf(newtime));
obj.put(“时区”,String.valueOf(timezone));
obj.put(“纬度”,字符串值(纬度));
obj.put(“lng”,字符串值(经度));
httppost.setEntity(新的StringEntity(obj.toString(),“UTF-8”);
//执行HTTP Post请求
response=httpclient.execute(httppost);
if(response.getStatusLine().getStatusCode()==200){
Log.d(“响应正常”、“到达服务器正常”);
startActivity(新意图(“com.xxxxx.CLEARSCREEN”);
}否则{
Log.d(“响应不正常”,“出现问题:/”;
}
responseBody=EntityUtils.toString(response.getEntity());
}捕获(客户端协议例外e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
捕获(JSONException e){
e、 printStackTrace();
}
返回响应体;
}

您可以通过以下代码解决此问题:

 Timer timer = new Timer();

  timer.scheduleAtFixedRate(new TimerTask() {
  public void run() {

    btnCreateUser.post(new Runnable() {
                @Override
                public void run() {
                    btnCreateUser .performClick();
                }
            }); 
  }
   }, 0, 14400); // for 4 hours

使用
AlarmManager
()在将来重复启动您的活动

假设您用来收集用户数据并将其发送到服务器的活动名为
YourActivity
,只需添加一些静态方法,如下所示,以安排活动开始。 您可以在应用程序启动时或从
BOOT\u COMPLETE
BroadcastReceiver
调用
schedule
方法

public static void schedule(Context context, String url,
        long triggerAtMillis, long intervalMillis) {
    final AlarmManager alarmManager =
            (AlarmManager) context.getSystemService(ALARM_SERVICE);
    alarmManager.setRepeating(AlarmManager.RTC, triggerAtMillis,
            intervalMillis, createPendingOperation(context));
}

public static void unschedule(Context context) {
    final AlarmManager alarmManager =
            (AlarmManager) context.getSystemService(ALARM_SERVICE);
    alarmManager.cancel(createPendingOperation(context));
}

private static PendingIntent createPendingOperation(Context context) {
    return PendingIntent.getActivity(
            context, 0, new Intent(context, YourActivity.class),
            PendingIntent.FLAG_CANCEL_CURRENT);
}

您可以使用button.performClick()函数以编程方式单击按钮。您可能希望为您的需求实现一个服务。感谢您查看了button.performClick()按钮我想你是对的,我可能需要实现一个服务,知道什么服务、计时器、背景吗?谢谢你,Michael,我实现它而不是点击按钮吗?最终按钮btnCreateUser=(button)findViewById(R.id.btnSend);timer timer=new timer();timer.scheduleAtFixedRate(新TimerTask(){public void run(){btnCreateUser.post(新Runnable(){@Override public void run(){btnCreateUser.performClick();}}}}},04400);让计时器正常工作Michael非常感谢,我将不得不把它放在后台活动中,但它非常完美。非常感谢你的回答,我会尝试一下,谢谢你花时间回复。