2014年12月24日 星期三

[Android] 透過程式碼清除預設值

在Android中有許多預設值,
像是預設的瀏覽器、信箱或是Home launcher等等。
通常要手動清除這些預設值會前往:
設定->應用程式->選定App->清除預設值

透過程式化最直覺的做法,
應該是使用clearPackagePreferredActivities函式,
只不過這只能用來清除自己App的設定值。

要清除別人的預設值,有一個小技巧,
例如要清除預設瀏覽器,首先先建立一個activity當作假的browser.
在AndroidManifest.xml中對FackActivity加入intent-filter

<activity
            android:name="com.example.safebrowsing.FackBrowser"
            android:enabled="false">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" /> 
                <category android:name="android.intent.category.BROWSABLE" />  
                <data android:scheme="http" />  
                <data android:scheme="https" />  

            </intent-filter>
</activity>

這是一般實作瀏覽器App會加入的intent-filter,
才會成為瀏覽器的選項之一。
要注意的是android:enabled="false"
先讓此activity失效。

接著在透過下列程式碼,達到清除瀏覽器預設值的效果。
public void onClickClearDefault(View view){
    String pn = MainActivity.class.getPackage().getName();
    String hn = FackBrowser.class.getName();
    ComponentName mhCN = new ComponentName(pn, hn); 
       
    pm.setComponentEnabledSetting(mhCN, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
        
    Uri uri = Uri.parse("http://");
    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    startActivity(intent);
  
    pm.setComponentEnabledSetting(mhCN, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

}
透過setComponentEnabledSetting讓FackBrowser啟用(Enabled),
隨後透過intent開啟一段網址,
再將FackBrowser停用(Disabled),
這時會跳出對話框,詢問使用者要使用哪一個瀏覽器開啟。
因為預設值已經被清除了。

至於為什麼這樣就能清除,
這可能需要看原始碼才能知道了。
感覺真像個bug.
清除其他預設值只要改一下intent-filter,
還有startActivity的intent加入對應的category.
就大功告成了。

2014年12月23日 星期二

[Android] 建立Home launcher App

通常,Home launcher就是內建的桌面,
一旦安裝了新的Home launcher App,
像是佈景主題,或是其他更改桌面配置的App.
內建桌面就會變更為新的Home launcher App.

要使自己的App變成Home launcher的選擇之一,
只要在AndroidManifest.xml中,
選擇一個activity加入對應的intent-filter,
當App變成預設的Home launcher時,
按下Home鍵就會呼叫該activity,
程式碼如下:

<activity
            android:name=".AppListLauncher">
            <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>

紅字部分就是成為Home launcher App的關鍵。
通常安裝在手機後,點擊Home鍵就會出現下列選單。














可能會有以下情況:

  1. 選單出現,
    • 代表Home launcher的預設值沒有設定或者預設值被清掉了。經過實驗,手機沒有安裝過其他Home launcher時,預設值沒有設定,因為此時的Home launcher只有內建桌面,雖然每次按下Home鍵內建桌面都會出現,但其實並沒有設定為預設值。有兩個(含)以上的Home launcher會因系統不知道啟動哪一個才會出現選單詢問用戶。
  2. 選單未出現,
    • 代表已有其他的Home launcher被設定為預設值,所以不需要選單詢問用戶,此時必須前往設定頁面,進入預設Home launcher的應用程式頁面,將預設值清除,之後按下Home鍵才會出現選單

2014年12月22日 星期一

[Android] 如何讓程式不在Recent App清單中出現?

首先前面是廢話,
想馬上知道答案的請直接往下看。

話說,距今出社會已經一年又三個月。
還記得當時就想開一個部落格,
將我在工作崗位上學到的新知記錄下來。
但認識我的人都知道其實我很懶,
導致拖到現在才建立此部落格!
這一年學到蠻多瑣碎的東西,
希望之後能把它慢慢補回來。
至於這個網誌能維持多久呢?
老實說我也沒有什麼把握,
我希望能持續維護,只要不停止,慢慢寫也行。

===進入題幹===

對於Android而言,
只要長按Home鍵就會出現Recent App.
至於怎麼樣把App從Recent App中移除呢?
在AndroidManifest.xml中加入下列紅字即可。

<activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:excludeFromRecents="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>