首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的onReceive方法被调用多个,并从我的MainActivity (磨损)触发onCreate

我的onReceive方法被调用多个,并从我的MainActivity (磨损)触发onCreate
EN

Stack Overflow用户
提问于 2018-01-14 22:34:35
回答 1查看 53关注 0票数 0

我对android相当陌生。我正在尝试使用WearableListenerService将数据从平板电脑发送到我的手机。这个部分工作得很好,我可以通过日志看到数据被发送。问题是,我从侦听器类中的tablet接收数据,并且必须将其传输到Mainactivity,以便更新我的视图。为此,我使用一个LocalBroadcaster,并在我的MainActivity中实现了onReceive方法。因此,当我命令从电话发送数据时,onReceive会被多次调用,大部分时间在2到3次之间,而且由于onCreate是由这种方法触发的,所以会重新创建该活动(我不知道这种行为是否会被期望)。

以下是代码:

DataLayerListenerService.java (听者)

代码语言:javascript
复制
public class DataLayerListenerService extends WearableListenerService {

// Tag for Logcat
private static final String TAG = "DataLayerService";
private int notificationId = 001;
private String notif;

// Member for the Wear API handle
GoogleApiClient mGoogleApiClient;

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

    // Start the Wear API connection
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Wearable.API)
            .build();
    mGoogleApiClient.connect();
}

//@Override
public void onDataChanged(DataEventBuffer dataEvents) {
    Log.v(TAG, "onDataChanged: " + dataEvents);
    for (DataEvent event : dataEvents) {
        if (event.getType() == DataEvent.TYPE_CHANGED) {

            Log.e(TAG, "DataItem Changed: " + event.getDataItem().toString() + "\n"
                    + DataMapItem.fromDataItem(event.getDataItem()).getDataMap());

            String path = event.getDataItem().getUri().getPath();

            switch (path) {
                case DataLayerCommons.NOTIFICATION_PATH:
                    Log.v(TAG, "Data Changed for NOTIF_PATH: " + event.getDataItem().toString());
                    DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem());
                    notif = dataMapItem.getDataMap().getString(DataLayerCommons.NOTIFICATION_KEY);
                    Intent intent = new Intent(NOTIFICATION_RECEIVED);
                    intent.putExtra(NOTIFICATION_RECEIVED, notif);
                    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

                    break;
                case DataLayerCommons.COUNT_PATH:
                    Log.v(TAG, "Data Changed for COUNT_PATH: " + event.getDataItem() + "\n"
                            + "Count data = " + DataMapItem.fromDataItem(event.getDataItem())
                            .getDataMap().getInt(DataLayerCommons.COUNT_KEY));
                    break;
                default:
                    Log.v(TAG, "Data Changed for unrecognized path: " + path);
                    break;
            }
        } else if (event.getType() == DataEvent.TYPE_DELETED) {
            Log.v(TAG, "DataItem Deleted: " + event.getDataItem().toString());
        }

        }
    }
}

主活性

代码语言:javascript
复制
public class MainActivity extends Activity {

private static final String TAG = "MainActivity";
public static final String NOTIFICATION_RECEIVED = "NOTIFICATION_RECEIVED";
private String notif="";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.e(TAG,"OnCreate");
    setContentView(R.layout.main_activity);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
            new IntentFilter(NOTIFICATION_RECEIVED));

}

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        Log.e(TAG, "Got message!");
        notif = intent.getStringExtra(NOTIFICATION_RECEIVED);
        TextView warnView = findViewById(R.id.warningView);
        warnView.setText(notif);

    }
};

}

AndroidManifest.xml

代码语言:javascript
复制
<uses-feature android:name="android.hardware.type.watch" />
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.VIBRATE"/>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.AppCompat">


    <meta-data
        android:name="com.google.android.wearable.standalone"
        android:value="false" />

    <meta-data
    android:name="com.google.android.gms.version"
    android:value="@integer/google_play_services_version" />

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

            <data
                android:host="*"
                android:pathPrefix="/notification"
                android:scheme="wear" />
        </intent-filter>
        <intent-filter>
            <action android:name="com.google.android.gms.wearable.MESSAGE_RECEIVED" />
            <data
                android:host="*"
                android:pathPrefix="/start-activity"
                android:scheme="wear" />
        </intent-filter>
    </service>

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <intent-filter>
            <action android:name="com.example.android.wearable.datalayer.EXAMPLE" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

</application>

谢谢你的帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-15 12:50:09

我建议使用Application类来存储您的活动,而不是BroadcastReceiver注册。

我的意思是:

Application类中,创建一个存储活动的变量:

代码语言:javascript
复制
class MyApp extends Application {
public static MyActivity activity;
}

若要将保存链接到onCreate中的此变量当前活动,并在onDestroy中发布,请执行以下操作。

不知何故:

代码语言:javascript
复制
public MyActivity extends Activity {
void onCreate() {
MyApp.activity = this;
}

void onDestroy() {
MyApp.activity = null;
}

void redraw() {
//redraw
}

}

在服务内部执行如下操作:

代码语言:javascript
复制
class MyService extends WearableListenerService {

void onDataChanged() {
if (MyApp.activity != null) {
MyApp.activity.redraw()
}
}

}

不要忘记在清单中设置应用程序:

代码语言:javascript
复制
<application
    android:name=".MyApp"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.AppCompat">
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48254845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档