8

私がやろうとしているのは、モーションイベントを現在実行中のアクティビティにディスパッチすることです。このコードから現在のアクティビティのComponentNameを取得しました

ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);

// get the info from the currently running task
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);

Log.d("current task :", "CURRENT Activity ::" + 
            taskInfo.get(0).topActivity.getClassName());

ComponentName componentInfo = taskInfo.get(0).topActivity;

コンポーネント名がわかったので、イベントをディスパッチしたい

dispatchTouchEvent(MotionEvent ev)

それはActivityクラスにあり、これを行うには、現在のアクティビティのインスタンスが必要です。コンポーネント名で立ち往生しています。Activityイベントをディスパッチできるようにインスタンスを取得するにはどうすればよいですか?

4

1 に答える 1

7

うわー、この質問には間違った点がたくさんあるので、どこから始めればいいのかわかりません! それらを順番に見てみましょう:

私がやろうとしているのは、モーションイベントを現在実行中のアクティビティにディスパッチすることです

現在のフォアグラウンド アクティビティは、そうでない場合を除き、モーション イベントを取得します。これが理にかなっていると想像できる唯一の方法は、あなたのサービスがすべてのアプリの上にシステムウィンドウを配置したことです...そしてその場合、これを行わずにフォアグラウンドをそのままにすることをお勧めしますアクティビティはイベントを処理します。

このコードから現在のアクティビティの ComponentName を取得しました

ActivityManager.getRunningTasks() は、通常のアプリケーション開発用ではありません。これは、タスク マネージャーなどを対象としています。この関数によって返される情報に依存するコア プログラム ロジックを記述しないでください。これはトラブルの元であり、実際、そのようなコードはいつか壊れることを保証できます。(複数のアプリケーションがフロントで同時に実行できる場合はどうなりますか?)

イベントをディスパッチしたい

あるウィンドウからモーション イベントをリッピングして別のウィンドウに詰め込むべきではありません。さまざまなディスパッチ状態が正しく設定されず、イベントの状態が一貫しなくなります (イベントは、新しいものではなく、元のウィンドウのオリジンなどで設定されました)。これは別のものです。将来壊れる可能性が高い不安定なアプリケーションを作成するための優れた方法です.

コンポーネント名で立ち往生しています。イベントをディスパッチできるように Activity インスタンスを取得するにはどうすればよいですか?

実際、あなたが持っているのはコンポーネント名だけです。これは、アクティブなインスタンスとは関係ありません。これを実際のインスタンスに変換する魔法の方法はありません。これは簡単にあいまいになる可能性があるため (インスタンス化されたそのクラスのインスタンスが 2 つある場合)、1 つを指定するのは間違っています。

最初に戻って、実際に何を達成しようとしているのかを見て、それに近づくための合理的な方法についての助けを得る必要があると思います. あなたがたどり着いた道は、この時点でかなりの終着点です。

于 2012-04-25T23:22:50.013 に答える