2011-07-15 51 views
13

Tôi đang tìm cách khởi chạy trình khởi chạy Android mặc định theo chương trình, một cái gì đó có thể giống như mã bên dưới. Hoặc tôi có phải thêm thứ gì đó vào tệp kê khai không? Cảm ơn!Khởi chạy trình khởi chạy Android mặc định theo lập trình

Intent intent = new Intent(); 
intent.setClassName("com.android.launcher", "Launcher"); 
startActivity(intent); 
+0

http://stackoverflow.com/questions/5547606/how-to-integrate-default-app-of-android-in-our-app-programatically –

Trả lời

19

Bạn đã thử cái này chưa?

startActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER)); 

(Tôi đã không thử nó bản thân mình, bởi vì trường hợp sử dụng của tôi là một chút phức tạp hơn --- Tôi đã thay thế launcher, và tôi muốn gọi launcher ...)

Tôi cũng đã phát hiện ra rằng bạn có thể sử dụng trình quản lý gói để xem qua tất cả các hoạt động đáp ứng một số tiêu chí lọc ý định. Ví dụ, nếu bạn muốn tìm tất cả các hoạt động đánh dấu là hoạt động chủ mặc định nhà, sử dụng này:

Intent intent=null; 
final PackageManager packageManager=getPackageManager(); 
for(final ResolveInfo resolveInfo:packageManager.queryIntentActivities(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME), PackageManager.MATCH_DEFAULT_ONLY)) 
{ 
    if(!getPackageName().equals(resolveInfo.activityInfo.packageName)) //if this activity is not in our activity (in other words, it's another default home screen) 
    { 
     intent=packageManager.getLaunchIntentForPackage(resolveInfo.activityInfo.packageName)); 
     break; 
    } 
} 

Lưu ý rằng tôi đã thay thế màn hình chủ mặc định trên điện thoại của tôi --- đó là lý do tại sao tôi phải làm chắc chắn hoạt động tôi tìm thấy không phải là hoạt động đang chạy! Nếu bạn chưa thay thế hoạt động mặc định của nhà, bạn không cần kiểm tra này --- chỉ cần sử dụng hoạt động nhà mặc định đầu tiên (và có thể là duy nhất).

(Lưu ý rằng tôi vẫn không thể khởi chạy trình khởi chạy cũ từ trình khởi chạy của tôi, có lẽ vì trình khởi chạy cũ giữ bản ghi trình khởi chạy mặc định, là trình khởi chạy mới của tôi và chỉ cần gọi lại. Nhưng ít nhất nó không sụp đổ, và tôi đoán rằng, nếu bạn không thay thế màn hình chính cũ, nó chỉ có thể hoạt động.)

+4

Xin lưu ý rằng phương thức getLaunchIntentForPackage sẽ không trả lại ý định trình khởi chạy kể từ nó chỉ kiểm tra các loại INFO và LAUNCH trong khi Laucher có chủ đề HOME. Điều này có nghĩa là cuộc gọi trong if bên trong for sẽ trả về một ý định rỗng. Thay thế khởi tạo ý định với mã dưới đây đã làm cho các trick cho tôi. ý định = new Intent() addCategory (Intent.CATEGORY_HOME) .setAction (Intent.ACTION_MAIN) \t \t \t \t \t \t .setClassName (resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name). – r1k0

+0

hey @GarretWilson, bạn có tìm ra cách khởi chạy trình khởi chạy không mặc định không? – isaganiesteron

+0

@isaganiesteron, xin lỗi, tôi đã không chạm mã này trong nhiều năm. Tôi không có bất kỳ bản cập nhật nào vào lúc này. –

2

Sau câu trả lời của Garret Wilson, đây là một lớp lót xấu xí, giả sử context là bối cảnh ứng dụng của bạn:

context.startActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME).setPackage(context.getPackageManager().queryIntentActivities(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME), PackageManager.MATCH_DEFAULT_ONLY).get(0).activityInfo.packageName)); 

mã này giả định rằng các hoạt động hệ thống nhà ban đầu luôn luôn là kết quả đầu tiên retur ned by queryIntentActivities, trong khi câu trả lời được chấp nhận trả về hoạt động nhà đầu tiên không thuộc về gói đang chạy.

Vẫn chưa rõ cách làm sạch hoạt động tại nhà của hệ thống. Một số chủ đề đề cập đến rằng getPackageManager().resolveActivity(intent, flags) có thể được sử dụng cho điều này, nhưng có vẻ như PackageManager.MATCH_SYSTEM_ONLY không thể được sử dụng với phương pháp này.

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