2017-08-29 6 views
0

Webサービスを呼び出した後でも、UIを5秒ごとに更新したいと考えています。私はサービスを作成し、放送受信機を使用してサーバーからデータを取得していますが、アプリケーションが終了したときにサーバーからの最後の応答を更新する必要があります。以下 アプリケーションが閉じられていても、バックグラウンドサービスからのアクティビティのテキストビューを更新する

YourService.javaコードスニペット

MainActivity.java

import java.text.DateFormat; 

import org.json.JSONArray; 

import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.support.v4.content.LocalBroadcastManager; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

TextView name1, name; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 

    name = (TextView)findViewById(R.id.name); 
    name1 = (TextView)findViewById(R.id.name1); 


    startService(new Intent(MainActivity.this, YourService.class)); 

} 

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // Get extra data included in the Intent 
     String nameStr = intent.getStringExtra("name"); 
     String name1Str = intent.getStringExtra("name1"); 
     name.setText(nameStr); 
     name1.setText(name1Str); 
    } 
}; 

@Override 
protected void onResume() 
{ 
    super.onResume(); 
    //registerReceiver(statusReceiver,mIntent); 
    LocalBroadcastManager.getInstance(MainActivity.this).registerReceiver(
      mMessageReceiver, new IntentFilter("UIValues")); 
} 

    @Override 
    protected void onPause() { 

    LocalBroadcastManager.getInstance(MainActivity.this).unregisterReceiver(mMessageReceiver); 
    super.onPause(); 
    } 
} 

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
tools:context=".MainActivity" > 

<TextView 
    android:id="@+id/name" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="20dp" 
    android:layout_marginTop="12dp" 
    android:hint="md5" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:textSize="20sp" /> 

<TextView 
    android:id="@+id/name1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="20dp" 
    android:layout_marginTop="12dp" 
    android:hint="name" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:textSize="20sp" /> 

</LinearLayout> 

あります

import learn2crack.asynctask.library.JSONParser; import android.app.Service; import android.content.Intent; import android.os.AsyncTask; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; public class YourService extends Service { private static final String TAG = "Your Service"; private final Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { } }; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { Log.d(TAG, "onCreate"); } @Override public void onDestroy() { super.onDestroy(); handler.removeCallbacks(sendUpdatesToUI); } private Runnable sendUpdatesToUI = new Runnable() { public void run() { new JSONParse().execute(); /// Any thing you want to do put the code here like web service procees it will run in ever 1 second handler.postDelayed(this, 5000); // 5 seconds } }; @Override public void onStart(Intent intent, int startid) { handler.removeCallbacks(sendUpdatesToUI); handler.postDelayed(sendUpdatesToUI, 1000);//1 second Log.d(TAG, "onStart"); } private class JSONParse extends AsyncTask<String, String, JSONObject> { @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected JSONObject doInBackground(String... args) { JSONParser jParser = new JSONParser(); // Getting JSON from URL JSONObject json = jParser.getJSONFromUrl(url); // server url return json; } @Override protected void onPostExecute(JSONObject json) { try { if(json != null){ JSONObject reader = new JSONObject(json.toString()); String name = reader.getString("name"); String name1 = reader.getString("name1"); Intent intent = new Intent("UIValues"); intent.putExtra("name", name); intent.putExtra("name1", name1); LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent); } } catch (JSONException e) { e.printStackTrace(); } } } 

JSONParser.java

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.UnsupportedEncodingException; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.util.Log; 

public class JSONParser { 

static InputStream is = null; 
static JSONObject jObj = null; 
static String json = ""; 

// constructor 
public JSONParser() { 

} 

public JSONObject getJSONFromUrl(String url) { 

    // Making HTTP request 
    try { 
     // defaultHttpClient 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpPost httpPost = new HttpPost(url); 

     HttpResponse httpResponse = httpClient.execute(httpPost); 
     HttpEntity httpEntity = httpResponse.getEntity(); 
     is = httpEntity.getContent();   

    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       is, "iso-8859-1"), 8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
     is.close(); 
     json = sb.toString(); 
    } catch (Exception e) { 
     Log.e("Buffer Error", "Error converting result " + e.toString()); 
    } 

    // try parse the string to a JSON object 
    try { 
     jObj = new JSONObject(json); 
    } catch (JSONException e) { 
     Log.e("JSON Parser", "Error parsing data " + e.toString()); 
    } 

    // return JSON String 
    return jObj; 

    } 
} 

のAndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.asynctask" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk android:minSdkVersion="15"/> 
<uses-permission android:name="android.permission.INTERNET" /> 

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

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <service android:name="com.asynctask.YourService"></service> 

</application> 

</manifest> 

誰もがこの問題を解決するために私を助けることができます。 ありがとうございます

+0

バッテリーの寿命は5秒ごとに何かするのは恐ろしいことです。ユーザーは**これについて非常に大声で** **不平を言っているので、Googleはこれをやらないように対策を続けています。たとえば、Android 6.0以降でDozeモードとアプリスタンバイを使用すると、ジョブが非常に頻繁に実行されることがあります(1時間に1回程度)。 Android 8.0以降では、サービスは約1分後に停止されます。 – CommonsWare

+0

Firebaseをこれに使用しないと、簡単に問題を解決できます。 Firebaseからデータを取得してTextviewで設定したら、Firebaseでそれを更新して、それを更新します。 –

+0

@CommsWareサービスは30秒ごとに呼び出される必要があります。 –

答えて

1

永続ストレージ(file、sharedprefernce)に最後のレスポンスを保存し、アプリが開いたら最後のレスポンスを表示するだけです。

0

あなたの応答をSharedPreferencesに保存すると、アクティビティが開かれていないときに、ビューがサービスから更新されない場合、アクティビティは閉じられたときにアクティビティが受信されません。一方、共有プリファレンスに最新の応答が格納されている場合は、作成されたアクティビティの値を読み取り、その値をビューに設定できます。 これにより、ビューで最新の応答が得られることが保証されます。

0

アプリが終了していないときは、データが更新されているかどうかを知ることができません。また、ユーザーに表示されていないときにアプリケーションのUIを更新することには意味がありません。必要なのは、アプリケーションを開くたびに更新する必要があるということです。 サービスでは、データを保存し、アクティビティのonCreate(Bundle savedInstanceState)メソッドでフェッチすることができます。

コーディングをお楽しみください!!

関連する問題