Có một số yếu tố có thể ảnh hưởng đến điều này:
Một ứng dụng phải tuyên bố rõ ràng rằng nó thích hợp hơn / có thể được cài đặt trên thẻ SD.
Bắt đầu với API cấp 8, bạn có thể cho phép ứng dụng của mình được cài đặt trên bộ nhớ ngoài (ví dụ: thẻ SD của thiết bị). Đây là một tính năng tùy chọn mà bạn có thể khai báo cho ứng dụng của mình với android:installLocation
thuộc tính tệp kê khai. Nếu bạn không khai báo thuộc tính này, ứng dụng của bạn sẽ chỉ được cài đặt trên bộ nhớ trong và nó không thể được chuyển sang bộ nhớ ngoài .
(Nhấn mạnh của tôi)
Một ứng dụng được thiết lập để biên dịch bằng API 7 (Froyo) hoặc thấp hơn, không hỗ trợ cài đặt ứng dụng trên thẻ SD (ngay cả khi nó được cài đặt trên GingerBread hoặc các thiết bị mới hơn)
Khả năng ứng dụng của bạn cài đặt trên bộ nhớ ngoài là một tính năng chỉ khả dụng trên các thiết bị chạy API cấp 8 (Android 2.2) trở lên. Các ứng dụng hiện có được xây dựng trước API Cấp 8 sẽ luôn cài đặt trên bộ nhớ trong và không thể chuyển sang bộ nhớ ngoài (ngay cả trên các thiết bị có API Cấp 8) . Tuy nhiên, nếu ứng dụng của bạn được thiết kế để hỗ trợ Cấp API thấp hơn 8, bạn có thể chọn hỗ trợ tính năng này cho các thiết bị có API cấp 8 trở lên và vẫn tương thích với các thiết bị sử dụng Cấp API thấp hơn 8.
(Nhấn mạnh của tôi)
Những lý do tại sao một số ứng dụng không thích được cài đặt trên thẻ SD như sau:
Khi người dùng cho phép lưu trữ dung lượng lớn USB để chia sẻ tệp với máy tính của họ (hoặc nếu không ngắt kết nối hoặc xóa bộ nhớ ngoài), mọi ứng dụng được cài đặt trên bộ nhớ ngoài và hiện đang chạy sẽ bị hủy. Hệ thống thực sự trở nên không biết đến ứng dụng cho đến khi bộ nhớ lớn bị vô hiệu hóa và bộ nhớ ngoài được hiển thị lại trên thiết bị. Bên cạnh việc giết ứng dụng và làm cho nó không có sẵn cho người dùng, điều này có thể phá vỡ một số loại ứng dụng theo cách nghiêm trọng hơn. Để ứng dụng của bạn hoạt động ổn định như mong đợi, bạn không nên cho phép ứng dụng của mình được cài đặt trên bộ lưu trữ ngoài nếu ứng dụng sử dụng bất kỳ tính năng nào sau đây, do hậu quả được trích dẫn khi không lưu trữ bộ nhớ ngoài:
Dịch vụ
Việc chạy của bạn Service
sẽ bị giết và sẽ không được khởi động lại khi bộ nhớ ngoài được kết nối lại. [...]
Dịch vụ báo động
Báo động của bạn đã đăng ký AlarmManager
sẽ bị hủy. [...]
Động cơ phương thức nhập liệu
IME của bạn sẽ được thay thế bằng IME mặc định. [...]
Hình nền sống
Hình nền Live đang chạy của bạn sẽ được thay thế bằng Hình nền sống mặc định. [...]
Tiện ích ứng dụng
Widget ứng dụng của bạn sẽ bị xóa khỏi màn hình chính. Khi bộ nhớ ngoài được kết nối lại, Tiện ích ứng dụng của bạn sẽ không có sẵn để người dùng chọn cho đến khi hệ thống đặt lại ứng dụng gia đình (thường là cho đến khi khởi động lại hệ thống).
Những người quản lí tài khoản
Tài khoản của bạn được tạo AccountManager
sẽ biến mất cho đến khi bộ nhớ ngoài được hiển thị lại.
Bộ điều hợp đồng bộ hóa
AbstractThreadedSyncAdapter
Chức năng đồng bộ hóa của bạn và sẽ không hoạt động cho đến khi bộ nhớ ngoài được kết nối lại.
Nhưng ngươi quản ly thiêt bị
DeviceAdminReceiver
Khả năng quản trị viên của bạn và tất cả sẽ bị vô hiệu hóa, điều này có thể gây ra hậu quả không lường trước được cho chức năng của thiết bị, có thể tồn tại sau khi bộ nhớ ngoài được kết nối lại.
Bộ thu phát đang nghe "đã hoàn thành khởi động"
Hệ thống cung cấp ACTION_BOOT_COMPLETED
phát sóng trước khi bộ nhớ ngoài được gắn vào thiết bị. Nếu ứng dụng của bạn được cài đặt trên bộ nhớ ngoài, nó không bao giờ có thể nhận được phát sóng này.
Nếu ứng dụng của bạn sử dụng bất kỳ tính năng nào được liệt kê ở trên, bạn không nên cho phép ứng dụng của mình cài đặt trên bộ nhớ ngoài.
(Một số phần được điều chỉnh lại. Họ đang giải thích những gì các nhà phát triển phải làm để làm cho ứng dụng của họ hoạt động chính xác sau khi thẻ SD được kết nối lại.)
Lưu ý : câu trả lời này đóng vai trò là thông tin chung cho "Tại sao một số ứng dụng không thể được chuyển sang thẻ SD"
Nguồn: Nhà phát triển Android: Vị trí cài đặt ứng dụng .