2013-02-27 17 views
6

Tôi đã tìm kiếm nhiều chủ đề và vẫn không thể tìm thấy câu trả lời cho câu hỏi của mình. Tôi đang làm việc trên ứng dụng Android sử dụng WebView.WebView saveState() có giữ lại các biến Javascript/môi trường không?

tôi sử dụng onSaveInstanceState()onRestoreInstanceState() để lưu trạng thái WebView như thế này:

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    webView.saveState(savedInstanceState); 
} 

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    webView.restoreState(savedInstanceState); 
} 

Tôi cũng có điều này trong onCreate() tôi:

public void onCreate(Bundle savedInstanceState) { 
    ... other code ... 
    if(savedInstanceState != null){ 
     webView.saveState(savedInstanceState); 
    }else{ 
     webView.loadUrl("http://mypage"); 
    } 
} 

Vấn đề : Có vẻ như khôi phục lại WebView không khôi phục lại tất cả các biến số Javascript biến/môi trường/không gian làm việc. Khi ứng dụng bị giết trong nền và sau đó được khôi phục, toàn bộ Javascript sẽ biến mất với tất cả các đối tượng/biến. Mã javascript có khoảng cách tên, tức là window.utilitiesPack, window.eventHandlers, window.automation, v.v ... và chúng không được xác định. Ngoài ra JQuery và các plugin javascript khác được sử dụng: tất cả chúng dường như không được xác định sau trạng thái khôi phục. Về cơ bản toàn bộ Javascript không được khôi phục.

Ai đó có thể xác nhận hoặc bác bỏ điều này thực sự là như thế nào (Javascript chưa được lưu)? Nếu toàn bộ không gian làm việc Javascript không được lưu, thì chính xác thì WebView.saveState() sẽ lưu lại điều gì? Có một số cách dễ dàng/thanh lịch để sử dụng API hiện có để bảo tồn các đối tượng Javascript không?

// ============================================ ==========

Update1: Vì vậy, vấn đề vẫn còn. Khó khăn đáng kể nhất là:

Kết quả là tôi sẽ khởi chạy Camera Intent. Khi chụp ảnh, ứng dụng sẽ quay lại hoạt động WebView và được cho là sử dụng Javascript để cập nhật HTML5 LocalStorage với một số biến dữ liệu.

Hoạt động chính với WebView bị giết khi hoạt động máy ảnh được hiển thị, vì vậy khi chúng tôi quay lại WebView, không còn Javascript nữa và không có chức năng nào tôi có thể gọi từ mã Android. Điều này xảy ra mỗi lần vào Galaxy S3. Nó vẫn xảy ra trên các điện thoại khác, nhưng không phải lúc nào cũng chụp ảnh.

Không biết phải làm gì ở đây. Bằng cách nào đó tôi phải thực hiện Hoạt động chính với WebView để giữ trạng thái trong khi hình ảnh đang được chụp với Camera Intent. Có ai có một ý tưởng làm thế nào điều này có thể đạt được?

+1

"Ai đó có thể xác nhận hoặc bác bỏ điều này thực sự là như thế nào" - bạn đã không xác nhận điều này bằng cách thử nó và thấy đó thực sự là những gì sẽ xảy ra? – millimoose

+0

(Tài liệu dường như ngụ ý rằng những gì được lưu là một 'WebBackForwardList'.) – millimoose

+1

" không phải bạn vừa xác nhận điều này bằng cách thử nó và thấy đó thực sự là những gì sẽ xảy ra? " Tôi không thể tin rằng toàn bộ Javascript không được lưu. Tôi hy vọng tôi không hiểu điều gì đó bởi vì nếu đúng như vậy, đây là một hạn chế đối với các ứng dụng sử dụng các trang web có chức năng javascript phức tạp. – user2113581

Trả lời

3

Rất ít thông tin được tìm thấy, chỉ dòng này:

Xin lưu ý rằng phương pháp này không còn lưu trữ các dữ liệu hiển thị cho WebView này. Các hành vi trước đó có khả năng có thể rò rỉ các tập tin nếu restoreState (Bundle) không bao giờ được gọi.

và dòng này:

Trả về bản sao cùng một phía sau/danh sách phía trước sử dụng để tiết kiệm nhà nước.

trong javadoc cho WebView.saveState(Bundle).

+1

Cảm ơn bạn đã trả lời. Đã một thời gian kể từ khi tôi gặp phải vấn đề này và vì vậy tôi đã quên câu hỏi của mình ở đây. Tôi đang đánh dấu câu trả lời của bạn là chính xác vì nó là. Đối với những người chạy vào cùng một vấn đề: cách tôi giải quyết nó là bằng cách xác định webView trong ngữ cảnh của ứng dụng thay vì trong ngữ cảnh của hoạt động. Bây giờ mọi thứ hoạt động như mong đợi. Vấn đề duy nhất với cách tiếp cận này là bạn sẽ phải ghi đè lênJsAlert() và onJsConfirm() để có alert()/confirm() làm việc. Ngoài ra,