2012-04-25 37 views
6

Điều tôi đang cố gắng thực hiện là gửi sự kiện chuyển động đến hoạt động hiện đang chạy. Tôi đã nhận được các ComponentName của hoạt động hiện tại từ mã nàyNhận ví dụ về hoạt động hiện đang chạy?

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; 

Bây giờ tôi có tên component, tôi muốn cử sự kiện

dispatchTouchEvent(MotionEvent ev) 

đó là trong lớp Activity, và để làm điều này tôi cần một thể hiện của hoạt động hiện tại. Tôi bị kẹt ở tên thành phần. Làm thế nào tôi có thể nhận được phiên bản Activity để tôi có thể gửi sự kiện này?

+1

xin vui lòng đặt một ít nỗ lực hơn vào định dạng mã của bạn lần sau ... –

Trả lời

7

Ồ, có quá nhiều điều sai với câu hỏi này thật khó để biết bắt đầu từ đâu! Chúng ta hãy xem chúng theo thứ tự:

gì tôi đang cố gắng làm là để gửi các sự kiện chuyển động tới hiện đang chạy hoạt động

Hoạt động foreground hiện tại sẽ nhận được các sự kiện chuyển động, trừ khi nó không nên. Cách duy nhất tôi có thể tưởng tượng điều này có nghĩa là dịch vụ của bạn đã đặt một cửa sổ hệ thống lên trên tất cả các ứng dụng ... và trong trường hợp đó, tôi sẽ khuyên bạn không nên làm điều này và chỉ để cho tiền cảnh của bạn hoạt động xử lý sự kiện.

tôi đã có các ComponentName của hoạt động hiện tại từ mã này

ActivityManager.getRunningTasks() là không cho phát triển ứng dụng bình thường. Điều này là dành cho những thứ như quản lý tác vụ và như vậy. Bạn không bao giờ nên viết logic chương trình lõi có phụ thuộc vào thông tin được trả về bởi hàm này. Đó là cầu xin cho sự cố, và trên thực tế tôi có thể đảm bảo mã như vậy sẽ phá vỡ tại một số điểm. (Chuyện gì xảy ra khi nhiều ứng dụng có thể được chạy ở phía trước đồng thời?)

Tôi muốn cử sự kiện

Bạn thực sự, thực sự không nên tách các sự kiện chuyển động ra khỏi một cửa sổ và nhồi chúng vào nhau. Trạng thái công văn khác nhau sẽ không được thiết lập chính xác, trạng thái trong sự kiện sẽ không nhất quán (sự kiện đã được thiết lập với nguồn gốc và như vậy cho cửa sổ gốc, không phải là mới bạn đang nhồi nó vào), v.v. cách tuyệt vời để tạo một ứng dụng không ổn định có cơ hội tốt để phá vỡ trong tương lai, nếu bạn thậm chí có thể kludge nó để làm cho nó hoạt động cả ngày hôm nay.

Tôi bị kẹt ở tên thành phần. Làm thế nào tôi có thể có được các hoạt động dụ để tôi có thể gửi các sự kiện?

Thật vậy, tất cả những gì bạn có là tên thành phần. Điều đó không liên quan gì đến các phiên bản hoạt động. Không có cách kỳ diệu để biến điều này thành một thể hiện thực tế. Sẽ rất sai khi cung cấp một cái, vì điều này có thể dễ dàng mơ hồ (nếu có hai trường hợp của lớp đó được khởi tạo).

Tôi nghĩ rằng bạn cần phải sao lưu để bắt đầu và xem những gì bạn đang thực sự cố gắng hoàn thành, để được trợ giúp về cách tiếp cận hợp lý của nó là gì. Con đường bạn đã nhận được chính mình là vào thời điểm này khá thiết bị đầu cuối.

+0

Cảm ơn bạn đã trả lời chi tiết của bạn, nhưng tại sao những phương pháp này có trong API, sẽ có cách nọ cách kia để sử dụng chúng – Ahmed

+0

Các phương pháp như boolean \t dispatchGenericMotionEvent (MotionEvent ev) Được gọi để xử lý các sự kiện chuyển động chung. boolean \t dispatchKeyEvent (sự kiện KeyEvent) Được gọi để xử lý các sự kiện quan trọng. boolean \t dispatchKeyShortcutEvent (sự kiện KeyEvent) Được gọi để xử lý sự kiện phím tắt. boolean \t dispatchPopulateAccessibilityEvent (AccessibilityEvent event) Được gọi là để xử lý dân số của AccessibilityEvents. boolean \t dispatchTouchEvent (MotionEvent ev) Được gọi để xử lý các sự kiện trên màn hình cảm ứng. boolean \t dispatchTrackballEvent (MotionEvent ev) Được gọi để xử lý các sự kiện trackball. – Ahmed

+1

Về cơ bản tôi không quan tâm đến việc phương pháp này sẽ sụp đổ ứng dụng một ngày nào đó, tôi phải làm cho nó trong điều kiện chạy mặc dù những trường hợp đặc biệt mà bạn đã đề cập đến. – Ahmed