2014-04-16 35 views
5

Tôi muốn bật hộp thoại cho phép người dùng chọn trình khởi chạy được khởi chạy với đặt làm tùy chọn mặc định. Tôi đã thửandroid: chọn trình khởi chạy mặc định theo chương trình

 Intent home = new Intent(Intent.ACTION_DEFAULT); 
    home.addCategory(Intent.CATEGORY_LAUNCHER); 
    Intent chooser = Intent.createChooser(home, "Launcher"); 
    context.startActivity(chooser); 

Nhưng hộp thoại xuất hiện bởi tùy chọn này không có tùy chọn đặt mặc định. Trong khi mã sau sẽ không bật lên hộp thoại nếu trình khởi chạy mặc định đã được đặt.

 Intent startMain = new Intent(Intent.ACTION_MAIN); 
    startMain.addCategory(Intent.CATEGORY_HOME); 
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(startMain); 

Làm cách nào để thực hiện điều này? Nhờ sự giúp đỡ trước.

Trả lời

10

Hãy thử sử dụng như sau:

Intent startMain = new Intent(Intent.ACTION_MAIN); 
startMain.addCategory(Intent.CATEGORY_HOME); 
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(startMain); 

Nếu một hành động mặc định đã được thiết lập (bạn), bạn có thể gọi đầu tiên:

getPackageManager().clearPackagePreferredActivities(getPackageName()); 

Nếu hành động mặc định không phải của mình, bạn không thể xóa nó theo chương trình, những gì bạn có thể làm là kiểm tra xem ứng dụng khác có được đặt làm mặc định hay không và hiển thị thông báo ..

private boolean isMyLauncherDefault() { 
    PackageManager localPackageManager = getPackageManager(); 
    Intent intent = new Intent("android.intent.action.MAIN"); 
    intent.addCategory("android.intent.category.HOME"); 
    String str = localPackageManager.resolveActivity(intent, 
      PackageManager.MATCH_DEFAULT_ONLY).activityInfo.packageName; 
    return str.equals(getPackageName()); 
} 

Là một workaround trong trường hợp ứng dụng khác được thiết lập như mặc định, bạn có thể tạo ra một ngôi nhà fake, cài đặt nó (điều này sẽ forse hệ thống để xóa các ứng dụng mặc định) và sau đó gỡ bỏ nó ...

Manifest .xml

<activity 
     android:name="FakeHome" android:enabled="false"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.HOME"/> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity> 

FakeHome.java

public class FakeHome extends Activity { 

} 

Somewhere

if(!isMyLauncherDefault()) {    
PackageManager p = getPackageManager(); 
ComponentName cN = new ComponentName(Activity.this, FakeHome.class); 
p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); 

Intent selector = new Intent(Intent.ACTION_MAIN); 
selector.addCategory(Intent.CATEGORY_HOME);    
startActivity(selector); 

p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);    
    } 
+2

Mã này sẽ không bật lên hộp thoại nếu trình khởi chạy mặc định đã được đặt. –

+0

Bạn đã bao giờ làm việc này chưa? – portfoliobuilder

+0

Tham số 'filters' của' getPreferredActivities() 'là tham số đầu ra. Thêm một mục bộ lọc vào danh sách trước khi cuộc gọi không có hiệu lực. –

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