1

Android Wear アプリを市場に出してから約 10 か月が経ちましたが、機能しなくなりました (いつ機能しなくなったのかはわかりません)。

モバイル アプリで記録した統計情報を使用して、ウェアラブル アプリケーションを更新しようとしています。私が言うように、これは以前は問題なく確実に機能していました。これにタイムスタンプも追加したので、onDataChangedデータが変更された場合にのみ呼び出されるため、一意でした。これはそれを保証します。

私の問題

PutDataMapRequest私は電話して罰金を提出することができWearable.DataApi.putDataItem、私のResultCallback.

onDataChanged通常最後に呼び出されますが、遅延は以前よりも長すぎます。さらに、起動するアプリがあり、そこにバックログがあるActivityため、正しく設定されていることがわかります。DataItems私はonDataChangedこれActivityでも同じ問題を抱えています。

私がやった事

  1. versionCode と versionName が両方のモジュールbuild.gradleファイルで一致していることを確認しました。
  2. 両方のbuild.gradleファイルがサポート ライブラリと Google サービス ライブラリの同じバージョンを使用していることを確認しました。
  3. 両方のクラスが接続していることを確認GoogleApiClient
  4. サービスで強制的に呼び出すために、データが毎回異なることを確認してonDataChangedください。これは必要ありませんが、機能させるためだけです。

マイコード

モバイル

if (mGoogleApiClient.isConnected()) {
            PutDataMapRequest putDataMapRequest = PutDataMapRequest.create(path);
            putDataMapRequest.getDataMap().putString("content", content);
            putDataMapRequest.getDataMap().putString("title", title);
            putDataMapRequest.getDataMap().putLong("timestamp", DateTime.now().getMillis());
            PutDataRequest request = putDataMapRequest.asPutDataRequest();    

            Wearable.DataApi.putDataItem(mGoogleApiClient, request)
                    .setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
                        @Override
                        public void onResult(DataApi.DataItemResult dataItemResult) {
                            if (!dataItemResult.getStatus().isSuccess()) {
                                Log.e("WearDevice", "buildWatchOnlyNotification(): Failed to set the data, "
                                        + "status: " + dataItemResult.getStatus().getStatusCode());
                            } else {
                                    Log.d(LOG_TAG, "Notificaiton result callback returned successfully: "+dataItemResult.getDataItem().toString());//: "+node.getDisplayName());
                            }
                        }
                    });
}

切る

拡張するサービスがありますWearableListenerService。これはマニフェストでそのように宣言されています。

<service android:name=".NotificationUpdateService">
            <intent-filter>
                <action android:name="com.google.android.gms.wearable.BIND_LISTENER"/>
            </intent-filter>
        </service>

これが私のサービスです。

@Override
    public void onCreate() {
        super.onCreate();

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(Wearable.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

        mGoogleApiClient.connect();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDataChanged(DataEventBuffer dataEvents) {
        if (MainActivity.DEBUGGING)
            Log.d(LOG_TAG, "onDataChanged");
        for (DataEvent dataEvent : dataEvents) {

            if (dataEvent.getType() == DataEvent.TYPE_CHANGED) {
                DataMap dataMap = DataMapItem.fromDataItem(dataEvent.getDataItem()).getDataMap();
                String content = dataMap.getString("content");
                String title = dataMap.getString("title");
                if ("/mydatapath".equals(dataEvent.getDataItem().getUri().getPath())) {
                    buildWearableOnlyNotification(title, content, false);
                }
            }
        }
    }

メソッドはbuildWearableOnlyNotificationフォアグラウンド通知を作成して開始し、実際に呼び出されると正常に機能します。

4

1 に答える 1

1

データをすぐに同期する場合は、緊急フラグを設定する必要があります。そうしないと、フレームワークはこれらの呼び出しをまとめて 1 回の呼び出しで実行します。つまり、最大 30 分の遅延が発生する可能性があります。このような即時のデータ同期が実際には必要ない場合にバッテリーを節約するために、最新の Play サービスで行われた変更です。

于 2015-11-24T21:02:54.513 に答える