2015-08-10 16 views
48

Tôi đang sử dụng dịch vụ trong ứng dụng cordova của mình tạo thông báo startForeground trong onCreate. Nếu ứng dụng bị giết qua thao tác vuốt và bắt đầu lại, sự kiện sẵn sàng cho thiết bị cordova sẽ không được kích hoạt nữa. Có vẻ như đối tượng cordova không được xác định khi ứng dụng được khởi động lại. Tôi nhận được thông báo lỗi sau:startForeground() gây ra sự cố với cordova

E/Web Console(19472): Uncaught TypeError: Object #<Object> has no method 'exec' at file:///android_asset/www/src/jsFile.js:31

Dòng 31 và sau:

cordova.exec(function (r) { 
      if (callback) { 
       callback(r); 
      } 
     }, function (err) { 
      if (callback) { 
       callback(false); 
      } 
     }, "Plugin", "functionName", []); 

Vấn đề chỉ xảy ra nếu tôi sử dụng startForeground phục vụ của tôi, nếu tôi nhận xét phần này của mã ra tất cả đều hoạt động bình thường. Tôi rất cần một số trợ giúp về các câu hỏi sau:

  • Có thể chạy cordova theo cách thủ công không?
  • Làm thế nào để bắt đầu dịch vụ với startForeground, nhưng vẫn kích hoạt cordova thiết bị sẵn sàng sau khi giết chết và khởi động lại ứng dụng

Edit:

Sau khi thực hiện hai dự án ví dụ nhanh, một ở Cordova 3.6 (phiên bản tôi đang sử dụng cho ứng dụng thực tế của tôi) và với Cordova 5.1, tôi nhận ra rằng sự cố không phải xảy ra trong phiên bản Cordova mới. Tuy nhiên tôi không thực sự muốn cập nhật, bởi vì:

  • Không bao giờ chạm vào một hệ thống chạy
  • Tôi không biết những gì có thể không hoạt động nữa trong phiên bản bao giờ, như tôi đã cài đặt nhiều plugin trong App của tôi .
  • Tôi lười biếng.

Bất kỳ ý tưởng nào có thể thay đổi từ 3,6 đến 5.1 đã giải quyết được lỗi và liệu tôi có thể cập nhật mã 3.6 của mình cho phù hợp không?

Edit2:

Đây là không một bản sao của this question. Hàm callReady deviceReady đã được truyền sai trong câu hỏi này. Đây không phải là trường hợp trong ứng dụng của tôi, và nó sẽ không có ý nghĩa để chỉ làm việc khi tôi không sử dụng startForeground trong dịch vụ của tôi.

+1

bạn có thể chỉnh sửa câu hỏi của mình và cung cấp mã JAVA (mã plugin) không. –

+1

Nó không quan trọng (99,9% chắc chắn), vì tôi có thể gọi bất kỳ Plugin nào tôi muốn và lỗi vẫn giữ nguyên. –

+0

Chỉ là một gợi ý đơn giản: nếu bạn vẫn gặp vấn đề (tôi đoán bạn đã tìm ra giải pháp), tham số 'useCapture' của bạn được đặt thành' false' ở cuối sự kiện nghe của bạn: 'addEventListener ('deviceready', onDeviceReady, false); –

Trả lời

-1

Khi JS không được viết trong callback onDeviceReady() sự kiện - hay Cordova WebView đang được nạp lại, khi Device là đã có trong "sẵn sàng" nhà nước - trong trường hợp này chỉ là sự kiện onDocumentReady() sẽ được kích hoạt một thời điểm khác.

thử thiết lập trường hợp thử nghiệm ghi lại thời điểm sự kiện nào được kích hoạt; sự khác biệt giữa Device & Document Sẵn sàng có thể là thủ phạm. ghi nhật ký chi tiết các sự kiện JS & Logcat được đề xuất.

nó có thể được yêu cầu để ràng buộc các sự kiện JS khác hoặc di chuyển mã ở giữa chúng, nhằm ngăn chặn tình trạng này, mà dường như là: để tải lại một WebView khi Device là "sẵn sàng", có thể là một số loại thực hiện cố gắng, hoạt động dựa trên khái niệm về việc có một ứng dụng JS chạy trong một triển khai thực hiện WebView? Nếu không thấy mã nhỏ nhất (rõ ràng là "ví dụ" này sẽ không hoạt động, trong khi có các tham chiếu bị hỏng), tôi đoán rằng Service đang chạy, trong khi Ứng dụng không thể khởi động nó.

Đây có thể là chức năng example của những gì bạn đang cố gắng lưu trữ.

Trong khi phiên bản hiện tại của Cordova là khá 7.0 so với 5.1.

+0

Tại thời điểm viết câu hỏi phiên bản hiện tại là 5.1 :) Tôi rất tự tin rằng mã của chúng tôi không phải là vấn đề, vì vấn đề dường như được sửa với bản cập nhật cordova, do đó chỉ ra một lỗi trong phiên bản trước đây của cordova. –

+0

@MichaelKunst Tôi tự tin, bạn không hiểu thứ tự của các sự kiện DOM ... cảm ơn bạn đã bỏ phiếu - sẽ không bao giờ cố gắng giúp đỡ một lần nữa, với bạn với câu hỏi noob của bạn. –

1

Dường như bạn đang gặp sự cố xung quanh vòng đời ứng dụng của mình. Khi bạn vuốt hoặc đóng ứng dụng một cách mạnh mẽ, quá trình ứng dụng sẽ bị hủy vì vậy khi khởi động lại nếu bạn không lưu các đối tượng hoặc biến phụ thuộc vào gói trạng thái, chúng sẽ trở lại thành rỗng vì hoạt động này giả định những thứ đó có sẵn. Bạn có thể dán mã bạn có trong các onCreate() am đoán thats cordova xác định của bạn.

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