[英]Send Ping on Android programmatically
好的,我不知道如何執行此操作,我需要一些幫助。
我需要將JSON格式的Ping發送到服務器,我已經將其包含所有需要的信息...時間戳,位置,device_id等...但是..如何每5分鍾發送一次自動?? 我仍在尋找有用的東西,但沒有成功..在這方面我是新來的。
這是我的代碼示例,如果對您有用,請隨時使用它:) ...
package com.example.hugo.ping03; // imports.... public class MainActivity extends ActionBarActivity { //HTTP private AsyncHttpClient client;//crear cliente private AsyncHttpResponseHandler handler;//crear handler private Button send; //JSON JSONObject json; //objeto json Context context = this; //context element private StringEntity entity; //entity //Battery private IntentFilter batIntentFilter; private Intent battery; private int nivelBateria; //device_id private String id; //timestamp private int time; private Timestamp tsTemp; private Long tsLong; private String ts; //GPS (this one comes from another class.java) GPSTracker gps; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ping03); client = new AsyncHttpClient(); String password = "pass"; client.setBasicAuth("hugo", password); send = (Button) findViewById(R.id.send); //battery level: batIntentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); battery = this.registerReceiver(null, batIntentFilter); nivelBateria = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); //device_id: id = Secure.getString(getContentResolver(), Secure.ANDROID_ID); //timestamp time = (int) (System.currentTimeMillis()); tsTemp = new Timestamp(time); tsLong = System.currentTimeMillis()/1000; ts = tsLong.toString(); handler = new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, byte[] response) { // called when response HTTP status is "200 OK" Log.d("onSuccess","ping exitoso !!!!"); Log.d("Nivel de Bateria:",String.valueOf(nivelBateria)); Log.d("Id de Dispositivo",id); Log.d("Timesatmp:",ts); } @Override public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) { // called when response HTTP status is "4XX" (eg. 401, 403, 404) String statuscode = String.valueOf(statusCode); Log.d("onFailure","ping nulo a causa de: "); Log.d("Server statusCode",statuscode); } }; send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //mensaje a Log para indicar clic en botón Log.d("onPressButton","Click exitoso"); String klientourl = "server url"; //Strings to Post JSON : String status = "1"; String device_id = id; String timestamp =ts; String battery = String.valueOf(nivelBateria); json = new JSONObject(); gps = new GPSTracker(Ping03.this);//creamos objeto de clase //if GPS is Enabled... if (gps.canGetLocation()){ double latitude = gps.getLatitude(); double longitude = gps.getLongitude(); Log.d("Location is:", "Lat: "+latitude+" Long: "+longitude); String IamHere = "Lat: "+latitude+" Long: "+longitude; try { json.put("geo", IamHere); json.put("status", status); json.put("device_id", device_id); json.put("timeStamp", timestamp); json.put("battery", battery); }catch (JSONException e){ Log.e("Json", "unexpected JSON exception", e); } try { entity = new StringEntity(json.toString()); entity.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); client.post(context, klientourl, entity, "application/json", handler); }catch (Exception e){} }else { //if we can gps.showSettingsAlert(); Log.d("Geoloc: ", "Disabled?"); } }// ./ end onClick }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_ping03, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
有任何想法嗎? 非常感謝!
如果要執行一些定期重復的任務,建議您使用Android SDK的AlarmManager組件。警報管理器是一項系統服務,因此您可以使用以下代碼行進行訪問。
AlarmManager mAlarmMgr=(AlarmManager) getSystemService(Context.ALARM_SERVICE);
//Then you can set alarm using mAlarmMgr.set().
然后,您將在AlarmReceiver中接收警報。
AlarmReciever類擴展了BroadcastReceiver並覆蓋onRecieve()方法。 在onReceive()中,您可以根據需要啟動活動或服務,例如可以啟動活動以振動電話或撥打電話。
這是來自Android開發人員的文章,描述了如何使用AlarmManager和AlarmReceiver: http : //developer.android.com/training/scheduling/alarms.html 。 成功使用AlarmManager設置警報(每5分鍾)並將其攔截到AlarmReceiver中之后,可以啟動IntentService,它將ping json發送到您的服務器。
我希望這有幫助。 干杯!
如果您想在修復時間后從android應用中命中服務器,則應創建一個后台服務。此服務類會在特定的延遲下頻繁調用服務器。
public class MyService extends Service{
Handler mHandler = new Handler();
@Override
public IBinder onBind(Intent arg0){
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId){
Log.e(TAG, "onStartCommand");
super.onStartCommand(intent, flags, startId);
return START_STICKY;
}
@Override
public void onCreate(){
Log.e(TAG, "onCreate");
mHandler.postDelayed(mRun,300000);
}
Runnable mRun = new Runnable() {
@Override
public void run() {
// TODO call your service here
mHandler.postDelayed(mRun,300000);
}
};
}
從您的活動開始服務,如下所示-
private void startService(){
Handler mStartServicehandler = new Handler();
mStartServicehandler.post(new Runnable() {
@Override
public void run() {
startService(new Intent(mContext,MyService.class));
}
});
}
做這樣的事情。 每隔5分鍾它將對您的服務器執行一次ping操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.