2012-07-02 16 views
6

My chính thức Android Ứng dụng đã C/Native Thư viện mà làm tất cả logic kinh doanh của đăng nhập/Logout, vvUDP/RTCP gói không đạt Device màn hình điện thoại/Application Whens đã bị đóng

Issue với điều này là khi màn hình thiết bị bị khóa ứng dụng (c Code) không thể nhận bất kỳ gói nào từ máy chủ. Tôi đã xác minh điều này với Wireshark. Có vẻ như CPU ​​không hoạt động.

Tôi đã có thể giải quyết sự cố xảy ra bên dưới trên INIT ứng dụng của mình.

WakeLock mWakeLock = null; 
PowerManager pm = (PowerManager) cxt.getSystemService(Context.POWER_SERVICE); 
if(mPartialWakeLock == null){ 
    // lock used to keep the processor awake. 
    mPartialWakeLock = pm.newWakeLock(
     PowerManager.PARTIAL_WAKE_LOCK 
      | PowerManager.ON_AFTER_RELEASE, TAG); 
    mPartialWakeLock.acquire; 
} 

Nhưng làm như trên sẽ làm hao pin.

Tại sao các yêu cầu không đạt được đơn đăng ký của tôi? Làm thế nào tôi có thể làm cho thiết bị CPU lên tất cả thời gian khi màn hình bị khóa và nhận được yêu cầu từ máy chủ?

Lưu ý: EDITED Device sử dụng: Samsung Rugby Smart i847 Hệ điều hành:. Android OS, v2.3.6 (Gingerbread.UCLA4)

Các ứng dụng hoạt động trên Galaxy s2 (Có phải vì Processor Dual Core của nó và CPU đang ở trên Screen LOCK?) SKYPE và VIBER được thiết kế WRT như thế nào ở chế độ Sleep?

+1

Sử dụng khóa và tháo pin; hoặc người nào khác không cố gắng làm điều này. Hoặc quyết định nếu C2DM có thể đáp ứng nhu cầu của bạn thay thế. Đó là sự cân bằng khi chạy bằng pin! –

+2

C2DM sẽ không phục vụ nguyên nhân của tôi ... Bất cứ điều gì khác u có thể đề nghị chris !! – NitZRobotKoder

+0

Có thể thiết bị của bạn đã lưu cài đặt pin để tắt mạng khi khóa màn hình? – xtr

Trả lời

1

Bạn có cân nhắc sử dụng service không?

Service đang cung cấp một cơ sở cho các ứng dụng để yêu cầu hệ thống về một cái gì đó nó muốn được làm trong nền (ngay cả khi người dùng không trực tiếp tương tác với các ứng dụng). Bằng cách khởi động nó, hệ thống sẽ lên kế hoạch làm việc cho dịch vụ, được chạy cho đến khi dịch vụ hoặc người khác ngăn chặn nó một cách rõ ràng.

Tôi đoán rằng có thể giúp .. Cheers

EDIT: Oki, u không đề cập đến các dịch vụ trước .. Tôi vẫn không chắc chắn nếu u có hai vấn đề (tháo pin và không nhận được dữ liệu) hoặc chỉ là một nơi mà ur nhận dữ liệu với cống ..?

Xem xét pin thoát nước u có thể thử nghiệm với các cờ khác nhau của WAKE_LOCK.

điều quan trọng tôi nhận thấy là bạn không phát hành khóa với mPartialWakeLock.release() như adviced trên được liên kết WAKE_LOCK page:

Device tuổi thọ pin sẽ bị ảnh hưởng đáng kể bởi việc sử dụng các API này. Không có được WakeLocks trừ khi bạn thực sự cần chúng, sử dụng mức tối thiểu có thể, và chắc chắn để phát hành nó càng sớm càng tốt.

Bên cạnh đó, theo một số khác posts, tốc độ cống pin phụ thuộc vào công việc và hiệu quả của điều ur làm trong dịch vụ, vì vậy đây là nơi mà chúng tôi không thể giúp đỡ mà không nhìn thấy hơn của mã ..: S

Btw .. IMHO nếu bạn chỉ chờ cuộc gọi đến và bạn luôn giữ WAKE_LOCK, đó có thể là nguyên nhân gây hao pin cao .. Hãy suy nghĩ xem bạn cần gì và cố gắng giảm thiểu sử dụng tài nguyên nếu bạn không cần chúng ..Hãy xem xét WIFI_LOCK ví dụ, và phát hành WAKE_LOCK càng sớm càng tốt ..

+0

Tôi có dịch vụ, Vấn đề là C/Native Code của tôi là người nhận yêu cầu từ máy chủ và sau đó nó sẽ đưa nó vào Lớp ứng dụng Android của tôi (UI), Ở đây các yêu cầu không đạt C/Native Code CPU không hoạt động. – NitZRobotKoder

+0

bây giờ tôi đã nhận nó ..: S – Ewoks

+0

Bất cứ điều gì u có thể thêm vào Ewoks !!! – NitZRobotKoder

1

Tôi đang làm việc trên một ứng dụng tương tự chạy một dịch vụ thiết lập kết nối TCP liên tục đến một máy chủ khi khởi động để có thể nhận tin nhắn từ máy chủ. Dịch vụ không có bất kỳ khóa nào. Phần này của ứng dụng đã được thực hiện một thời gian trước đây, và cho đến nay tôi đã không gặp bất kỳ vấn đề gì khi không thể nhận được tin nhắn từ máy chủ. Sau khi đọc câu hỏi của bạn, tôi quyết định thử nghiệm tại sao tôi không gặp vấn đề này.

Tôi nghĩ rằng ngay cả khi tôi không giữ bất kỳ ổ khóa nào, có thể có các ứng dụng khác đang hoạt động, do đó giữ cho CPU hoạt động. Chạy adb shell dumpsys, tôi nhận thấy rằng đây không phải là trường hợp: mLocks.size=0.

Điều này phải có nghĩa là ứng dụng vẫn có thể nhận gói, ngay cả khi thiết bị đang ngủ. Tôi không thể tìm thấy bất kỳ điều gì chính thức về vấn đề này, nhưng một số bài đăng trên internet dường như đồng ý:

Mặc dù tôi không tìm thấy ví dụ hay về nơi tài liệu này được ghi, có vẻ như ngay cả khi điện thoại của bạn đang ngủ, nếu dữ liệu được nhận vào kết nối, mã của bạn sẽ được đánh thức [...] (source)


> nói rằng thiết bị đang trong giấc ngủ sâu và mạng chồng nhận được một gói tin đến . Điều đó sẽ đánh thức thiết bị lên?

Nên. (source)

Tuy nhiên, lưu ý rằng cả hai nguồn đều khuyên bạn nên lấy khóa đánh thức để xử lý các gói nhằm ngăn thiết bị ngủ trong quá trình xử lý này. Tôi không làm điều đó trong ứng dụng của tôi (có lẽ tôi nên), nhưng chế biến của tôi là thực sự ngắn.

Khi bạn nói rằng yêu cầu của bạn không đạt được đơn đăng ký, bạn có chắc chắn rằng chúng không phải là không? Có thể họ đang có, nhưng ứng dụng của bạn rơi vào giấc ngủ trước khi nó có thể gửi trả lời? Hãy thử lấy khóa đánh thức khi bạn nhận được dữ liệu trên ổ cắm của bạn và phát hành nó sau khi bạn đang thực hiện với chế biến của bạn.

+0

hoàn toàn đồng ý với @Artyom. Tôi đoán vấn đề của ông là sử dụng mã nguồn gốc cho "tất cả logic kinh doanh của đăng nhập/Đăng xuất vv .." - có nghĩa là tất cả mọi thứ! Đó là lý do tại sao anh ta giữ WAKE_LOCK quá dài, mà tất nhiên cống pin .. – Ewoks

+0

Nhưng ứng dụng hoạt động trên thiết bị S2 như quyến rũ !! Vấn đề là với Samsung Rugby thông minh I847 – NitZRobotKoder

+0

@NitZRobotKoder Có thể trên S2 thiết bị vẫn tỉnh táo đủ lâu để xử lý của bạn hoàn tất. Bạn đã thử những gì tôi đề xuất trong câu trả lời của tôi chưa? – Artyom

0

Không cần sử dụng wakelocks vì chúng không đáng tin cậy và lỗi.

Nó sẽ hiệu quả hơn để sử dụng phiên bản riêng của hệ thống giữ màn hình trên một cách dễ quản lý được đưa về chăm sóc bởi Android:

Trong onCreate trong hoạt động của bạn, làm điều này:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | 
        WindowManager.FLAG_SHOW_WHEN_LOCKED); 

Đây là từ API của nhà phát triển tìm thấy here:

public static int thức FLAG_SHOW_WHEN_LOCKED

Vì: Cờ cửa sổ cấp 5 API: cờ đặc biệt để cho phép hiển thị cửa sổ khi màn hình bị khóa. Điều này sẽ cho phép các cửa sổ ứng dụng chiếm ưu thế cao hơn mức bảo vệ quan trọng hoặc bất kỳ màn hình khóa nào khác là . Có thể sử dụng với FLAG_KEEP_SCREEN_ON để bật màn hình và hiển thị cửa sổ trực tiếp trước khi hiển thị cửa sổ bảo vệ khóa.Có thể được sử dụng với FLAG_DISMISS_KEYGUARD để tự động loại bỏ hoàn toàn các khóa an toàn không an toàn . Cờ này chỉ áp dụng cho cửa sổ toàn màn hình ở trên cùng.

Giá trị không đổi: 524.288 (0x00080000)

Bằng cách kết hợp nó với màn hình hiệu quả trên lá cờ, sẽ nhận được xung quanh cơ sở màn hình khóa. Điều duy nhất là để đảm bảo rằng hoạt động của bạn là hoạt động hàng đầu trên màn hình.

Để báo, về việc sử dụng FLAG_KEEP_SCREEN_ON của PowerManager

public static int SCREEN_BRIGHT_WAKE_LOCK thức

liên tục này bị phản đối. Hầu hết các ứng dụng nên sử dụng FLAG_KEEP_SCREEN_ON thay vì loại khóa thức thức này vì nó sẽ là được nền tảng quản lý đúng cách khi người dùng di chuyển giữa các ứng dụng và không yêu cầu sự cho phép đặc biệt. Khóa đánh thức đảm bảo rằng màn hình ở chế độ sáng đầy đủ; bàn phím đèn nền sẽ được phép tắt.

0

Không cần phải tạo các mã như vậy không hoạt động - tại sao bạn không sử dụng phần mềm đã sẵn sàng? Chúng tôi sử dụng Ozeki Phone System XE PBX và điện thoại Android (có 30 điện thoại Android được kết nối với hệ thống bằng VoIP) và chúng hoạt động không an toàn.

Kiểm tra này ra: Link

Chưa bao giờ có vấn đề với việc xử lý giao thức RTCP. Hãy thử phiên bản dùng thử nếu bạn muốn.

Hy vọng tôi có thể trợ giúp.

0

Không thể nhận dữ liệu UDP trong khi Ứng dụng đang chạy dưới nền. Vì khách hàng của bạn đang gửi dữ liệu dưới dạng đa hướng. Trong khi bạn khóa màn hình thiết bị di động và ứng dụng đang chạy ẩn, trong trường hợp này phần cứng di động có bộ lọc mac và bộ lọc ip chỉ có thể chấp nhận dữ liệu trỏ đến một IP cụ thể thuộc về thiết bị. Nói một cách đơn giản là bạn cần phải làm unicast. Ví dụ: Có máy khách gửi dữ liệu trên một ổ cắm và ip cụ thể (trong trường hợp bạn có thể đang gửi dữ liệu trên 255.255.255.255) và dữ liệu của bạn được phát trên một cổng cụ thể nếu có thiết bị nào sẵn sàng nhận dữ liệu cổng đó đang hoạt động như một máy chủ, ví dụ như ứng dụng của bạn đang hoạt động như một máy chủ và nếu ứng dụng của bạn đang chạy trên nền trước, nó nhận dữ liệu. và khi bạn ứng dụng trong nền ứng dụng sẽ không.

Vì vậy, những gì bạn phải làm là bạn phải lấy địa chỉ IP của thiết bị và bạn phải gửi dữ liệu trên địa chỉ IP của thiết bị của bạn có nghĩa là bạn sẽ làm unicast. Trong ứng dụng này, bạn sẽ nhận được dữ liệu chạy nền hoặc nền trước và màn hình điện thoại của bạn bị khóa.

Các vấn đề liên quan