Ứng dụng của tôi cài đặt các ứng dụng khác và nó cần theo dõi những ứng dụng nào đã cài đặt. Tất nhiên, điều này có thể đạt được bằng cách chỉ cần giữ một danh sách các ứng dụng đã cài đặt. Nhưng điều này không cần thiết! Trách nhiệm của Gói quản lý là duy trì mối quan hệ đã cài đặtBy (a, b). Trên thực tế, theo API đó là:
chuỗi trừu tượng công khai getInstallerPackageName (String packName) - Lấy tên gói của ứng dụng đã cài đặt một gói. Điều này xác định thị trường mà gói đến từ đâu.
Cách tiếp cận hiện tại
Cài đặt APK bằng Intent
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
startActivity(intent);
Gỡ cài đặt APK bằng Intent:
Intent intent = new Intent(Intent.ACTION_DELETE, Uri.fromParts("package",
getPackageManager().getPackageArchiveInfo(apkUri.getPath(), 0).packageName,null));
startActivity(intent);
Đây rõ ràng không phải là cách ví dụ như cài đặt / gỡ cài đặt Android Market. Họ sử dụng một phiên bản phong phú hơn của Gói Trình quản lý. Điều này có thể được nhìn thấy bằng cách tải xuống mã nguồn Android từ kho lưu trữ Android Git. Dưới đây là hai phương thức ẩn tương ứng với phương pháp Ý định. Thật không may, chúng không có sẵn cho các nhà phát triển bên ngoài. Nhưng có lẽ họ sẽ ở trong tương lai?
Cách tiếp cận tốt hơn
Cài đặt APK bằng Trình quản lý gói
/**
* @hide
*
* Install a package. Since this may take a little while, the result will
* be posted back to the given observer. An installation will fail if the calling context
* lacks the {@link android.Manifest.permission#INSTALL_PACKAGES} permission, if the
* package named in the package file's manifest is already installed, or if there's no space
* available on the device.
*
* @param packageURI The location of the package file to install. This can be a 'file:' or a
* 'content:' URI.
* @param observer An observer callback to get notified when the package installation is
* complete. {@link IPackageInstallObserver#packageInstalled(String, int)} will be
* called when that happens. observer may be null to indicate that no callback is desired.
* @param flags - possible values: {@link #INSTALL_FORWARD_LOCK},
* {@link #INSTALL_REPLACE_EXISTING}, {@link #INSTALL_ALLOW_TEST}.
* @param installerPackageName Optional package name of the application that is performing the
* installation. This identifies which market the package came from.
*/
public abstract void installPackage(
Uri packageURI, IPackageInstallObserver observer, int flags,
String installerPackageName);
Gỡ cài đặt APK bằng Trình quản lý gói
/**
* Attempts to delete a package. Since this may take a little while, the result will
* be posted back to the given observer. A deletion will fail if the calling context
* lacks the {@link android.Manifest.permission#DELETE_PACKAGES} permission, if the
* named package cannot be found, or if the named package is a "system package".
* (TODO: include pointer to documentation on "system packages")
*
* @param packageName The name of the package to delete
* @param observer An observer callback to get notified when the package deletion is
* complete. {@link android.content.pm.IPackageDeleteObserver#packageDeleted(boolean)} will be
* called when that happens. observer may be null to indicate that no callback is desired.
* @param flags - possible values: {@link #DONT_DELETE_DATA}
*
* @hide
*/
public abstract void deletePackage(
String packageName, IPackageDeleteObserver observer, int flags);
Sự khác biệt
Khi sử dụng ý định, trình quản lý gói cục bộ không được biết cài đặt bắt nguồn từ ứng dụng nào. Cụ thể, getInstallerPackageName (...) trả về null.
Phương thức ẩn installPackage (...) lấy tên gói trình cài đặt làm tham số và rất có thể có khả năng đặt giá trị này.
Câu hỏi
Có thể chỉ định tên trình cài đặt gói bằng cách sử dụng ý định? (Có lẽ tên của gói trình cài đặt có thể được thêm vào như một phần bổ sung cho mục đích cài đặt?)
Mẹo: Nếu bạn muốn tải xuống mã nguồn Android, bạn có thể làm theo các bước được mô tả tại đây: Tải xuống Cây nguồn. Để trích xuất các tệp * .java và đặt chúng vào các thư mục theo phân cấp gói, bạn có thể xem tập lệnh gọn gàng này: Xem Mã nguồn Android trong Eclipse .