5

Google マップに追加情報を表示するアクティビティがあります。また、サーバーから情報をダウンロードし、PendingIntent を使用して情報の別の部分が読み込まれていることをアクティビティに定期的に通知するサービスもあります。
Android 4.0.3 では、すべて正常に動作します。しかし、Android 2.3.4 では、サービスがこのアクティビティを通知するたびに、アクティビティのマップが点滅します (グレーになり、リロードされます)。
マップが onActivityResult のどこかで更新されているかどうかを追跡しようとしましたが、そうではありません。
どんな助けでも感謝します。ここにいくつかのコードがあります:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   if (requestCode == SERVICE_CACHED) {
        String fmId = data.getStringExtra("cachedId");
        if (dev.get(position).getId().equals(fmId)) {   //we still viewing the same device
            long[] dat = data.getLongArrayExtra("dates");
            ArrayList<Date> dates = new ArrayList<Date>();
            for (int i=0; i<dat.length; i++) {
                dates.add(new Date(dat[i]));
            }

            addDates(fmId, dates, false, true);

//this is executed only once, as it meant to be
            if ((dispDate.getText() == null) || (dispDate.getText().toString().isEmpty())) {
                State state;
                synchronized(DBHelper.class) {
                    state = DBHelper.getState(fmId, dates.get(0).getTime());
                }


                updDispState(state);
            }
        }
    }
}


public void addDates(String fmId, ArrayList<Date> dates, boolean clear, boolean addTimesTo0) {
    if (dev.get(position).getId().equals(fmId)) {   //maybe user already changed selected device
        if (clear) {
            this.dates = dates;
        } else {
            this.dates.addAll(0, dates);
        }
        updDateSpinners(clear, dates, addTimesTo0);
    }
}

サービスはこれを使用してアクティビティに通知します:

private void cache(LinkedList<State> statsAll, LinkedList<Long> datesAll) {
        if ((statsAll == null) || (statsAll.isEmpty()) || (datesAll == null) || (datesAll.isEmpty())) {
            return;
        }

        synchronized(DBHelper.class) {
            DBHelper.addStates(statsAll, fmId);
        }
        //inform MapActivity that new data is available
        long[] l = new long[datesAll.size()];
        for (int i=0; i<l.length; i++) {
            l[i] = datesAll.get(i);
        }
        Intent intent = new Intent().putExtra("cachedId", fmId).putExtra("dates", l);
        try {
            pi.send(CacheService.this, MapActivity.SERVICE_CACHED, intent);
        } catch (PendingIntent.CanceledException e) {}          
    }

更新
さらにテストを行うと、 onResume() 呼び出しごとにマップが再ロードされるだけであることがわかりました。それを止める方法は?
次のようにマップをxmlに入れます:

<fragment             
    android:id="@+id/mapF"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.google.android.gms.maps.SupportMapFragment" /> 

そして、後でコードで取得します

GoogleMap map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapF)).getMap();    
4

2 に答える 2

1

onActivityResultサービスからこのように使用しないでください。BroadcastReceiver代わりにa の使用を検討してください。クラスでブロードキャストActivityリスナーを登録し、新しい情報が利用可能になったときにServiceブロードキャストを送信する必要があります。Intent

于 2013-07-02T06:18:44.680 に答える
0

Android 4.0でマップを移動する(メニューを表示する)と同様の問題が発生しますが、2.3ではあなたが言ったことが起こります。私はそれを修正するために何もできなかったので、私の解決策は相対レイアウトを使用し、地図の前に情報を表示することでした. Androidの「古いバージョン」では、マップがバックグラウンドでの更新用に最適化されていないと思います。これが、彼が黒くなって更新する理由です。

于 2013-07-02T06:23:01.433 に答える