2012-12-20 40 views
8

Tắt Tôi đang làm việc trên một ứng dụng cần chạy JavaScript khi ứng dụng không ở nền trước; vấn đề xuất hiện là khi ứng dụng được đưa vào nền/webview được tách ra khỏi màn hình, phương thức onPause của webview được gọi theo mỗi tài liệu: "Tạm dừng bất kỳ xử lý bổ sung nào liên quan đến WebView này và DOM được liên kết của nó, plugin, JavaScript, v.v ... "Tiếp tục lại chế độ xem web trên Android khi bị tạm dừng bởi JavaScript OS/chạy trên ứng dụng ở chế độ nền?

Từ những gì tôi đã tìm thấy, đến nay, đặt cược tốt nhất của tôi có vẻ là sử dụng sự phản chiếu để gọi phương thức "onResume" của webview nên hoàn tác tất cả các quá trình tạm ngưng này. Với thực hiện hiện tại của tôi, tôi nhận được một cá thể của phương thức đã nói nhưng khi được gọi thì không có gì xảy ra khi cuộc gọi JavaScript tiếp theo của tôi không làm gì cả (nhớ bạn làm việc này khi tôi mở ứng dụng và ở nền trước).

Bất kỳ ai khác thấy sự cố mã của tôi hoặc có giải pháp chạy JavaScript khi ứng dụng của bạn chạy ẩn mà không cần khởi chạy ứng dụng đầy đủ?

nhắn Đẩy do thỏa thuận nói cần JavaScript để được chạy để ý sẽ được gửi đến thông báo dịch vụ đang chạy ở chế độ nền:

Intent intent = new Intent("some action"); 
intent.putExtra("xtifyJson", xtifyJSON.toString()); 
context.sendBroadcast(intent); 

Trong onReceive của máy thu phát sóng của tôi, mà sống trong các dịch vụ nền luôn luôn chạy:

phương pháp phản ánh
final String stringArrayExtra = intent.getStringExtra("xtifyJson"); 
if (!Text.isNull(stringArrayExtra)) { 

    new Handler(context.getMainLooper()).post(new Runnable() { 

      @Override 
      public void run() { 
      try { 
       Log.d("Hey Dev Guy", "Message received"); 
       JavaScriptInterface javaScriptInterface = ((SpecialApplication) getApplicationContext()).getJavaScriptInterface(); 
       relectHiddenMethod(javaScriptInterface.getParentWebView(), "onResume"); 
       javaScriptInterface.getParentWebView().resumeTimers(); 
       javaScriptInterface.callBackPushReceived(new JSONObject(stringArrayExtra)); 

      } 
      catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      } 
     } 
    }); 

} 

reflectHiddenMethod:

private void reflectHiddenMethod(final WebView webview, final String name) { 

    if (webview != null) { 
     try { 
      Method method = WebView.class.getMethod(name); 
      Object invoke = method.invoke(webview); 
     } 
     catch (final Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

Hơi xảy ra [câu hỏi] (http://stackoverflow.com/questions/7884568/android-webview-inside-a-service). Ý tưởng chính - chuyển phần giao tiếp từ JavaScript sang dịch vụ. – Stan

Trả lời

1

Thật không may điều này sẽ không hoạt động. WebView là một thành phần giao diện người dùng và do đó cần được gắn vào cửa sổ. Có những tài liệu tham khảo khác ở đây trên StackOverflow về điều này như ở đây: Android webview inside a service?.

Một khả năng sẽ là xem xét các thư viện JavaScript thay thế để thực thi mã của bạn mà không cần WebView, ví dụ: Rhino, V8 hoặc spidermonkey.

Nhưng có lẽ giải pháp tốt nhất là triển khai tính năng nhắn tin đẩy của bạn trong Java.

+0

Có, một khi bạn bắt đầu cho phép ứng dụng chạy javascript trong nền, bạn đang trên đường làm cho thiết bị quá chậm để có thể sử dụng cho chủ sở hữu. –

+0

Bạn có thể cung cấp bất kỳ tài liệu tham khảo nào không? Webview có thể được tách ra và gắn liền với cửa sổ mà không có vấn đề gì –

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