2

複数のアクティビティとサービスがあるシナリオがあります。このすべてのアクティビティは、任意の URL からデータを取得する必要がある場合にサービスを開始し (アクティビティclass nameはインテントで渡されます) 、応答を取得するときにサービスによって送信されるBroadcastReceiverリッスンする を登録します。応答とともに Intentで back を渡します。responseIntentServiceclass name

私はこれを実装しましたが、動作します。しかし、疑問は、BroadcastReceiveronReceive()メソッドから、ブロードキャスト イベントを受け取ったアクティビティのメソッドをどのように呼び出すことができるかということです。

注:オブジェクトではなくクラス参照を扱いたいです。私はこれを試しました、

public void onReceive(Context context, Intent intent) {
    Class<?> thisActivity = Class.forName(intent.getStringExtra("ClassName"));
    thisActivity.hello();  // hello() is a public and static method
}

しかし、うまくいきません。

ありがとうございました。

4

3 に答える 3

0

Intent の「ClassName」から抽出しようとしているクラス名をどのように取得しましたか?

意図の準備:

Intent i = new Intent(....);
String className = MyClass.class.getCanonicalName();
i.putExtra(CLASS_NAME, className);

インテント コンテンツの抽出:

String canName = intent.getStringExtra(CLASS_NAME);
mClientClass = Class.forName(canName);
java.lang.reflect.Methodm m = mClientClass.getMethod("hello", new Class[] {});

結果の取得:

Object result = m.invoke(mClientClass, new Object[] {});
于 2014-10-31T08:35:47.843 に答える
0

を介してオブジェクト参照を渡すことはできませんIntentParcelableオブジェクトはオブジェクトと同じSerializableで、それらの参照は失われると想像してください。

BroadcastReceiverあなたはあなたの内部クラスとしてあなたを宣言する必要があります.そうすればActivity、あなたはそれを囲むActivity. これがその方法です。

于 2013-06-17T12:27:06.470 に答える
0

次のように、完全なパッケージ名を「ClassName」文字列に追加する必要があります。

Class<?> thisActivity = Class.forName(intent.getStringExtra("com.android.youapp.ClassName"));

注: このクラスが別のライブラリ プロジェクトに存在する場合は、それに応じて文字列名を設定する必要があります。

于 2014-08-31T13:44:25.680 に答える