簡體   English   中英

以編程方式在Android上發送Ping

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM