android動態切換logo和label
阿新 • • 發佈:2019-01-03
需求:動態控制logo切換;模仿淘寶京東雙11那樣,過了雙11logo再換成正常的logo
涉及到的知識點:
內容 | 解釋 |
---|---|
activity-alias | 標籤的屬性,和activity標籤的屬性一致,相當於activity的複製品 |
name | 元件名稱 |
enabled | 元件是否可用 |
icon | logo |
label | 標籤 |
targetActivity | 別名啟動的activity |
程式碼中動態控制組件是否可用
/** * 啟動元件 * @param componentName 元件名 */ private void enableComponent(ComponentName componentName) { //此方法用以啟用和禁用元件,會覆蓋Androidmanifest檔案下定義的屬性 mPackageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); } /** * 禁用元件 * @param componentName 元件名 */ private void disableComponent(ComponentName componentName) { mPackageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); }
清單檔案程式碼:
<?xml version="1.0" encoding="utf-8"?> <manifest package="com.hj.logo" xmlns:android="http://schemas.android.com/apk/res/android"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:enabled="false" android:icon="@mipmap/ic_launcher_round" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity-alias android:name=".MainActivity0" android:enabled="true" android:icon="@mipmap/ic_1111" android:label="@string/app_name1" android:targetActivity=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity-alias> <activity-alias android:name=".MainActivity1" android:enabled="false" android:icon="@mipmap/ic_1212" android:label="@string/app_name2" android:targetActivity=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity-alias> <activity-alias android:name=".MainActivity2" android:enabled="false" android:icon="@mipmap/ic_1313" android:label="@string/app_name3" android:targetActivity=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity-alias> </application> </manifest>
佈局檔案程式碼:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:onClick="jump01"
android:layout_width="match_parent"
android:layout_height="48dp"
android:text="雙11logo"
/>
<Button
android:onClick="jump02"
android:layout_width="match_parent"
android:layout_height="48dp"
android:text="雙12logo"
/>
<Button
android:onClick="jump03"
android:layout_width="match_parent"
android:layout_height="48dp"
android:text="元旦logo"
/>
</LinearLayout>
String.xml:
<resources>
<string name="app_name">ChangeLogo</string>
<string name="app_name1">雙11Logo</string>
<string name="app_name2">雙12Logo</string>
<string name="app_name3">元旦Logo</string>
</resources>
程式碼中控制組件是否可用:
package com.hj.logo;
import android.content.ComponentName;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
public class MainActivity extends AppCompatActivity {
//雙11元件名稱
private ComponentName componentName1;
//雙12元件名稱
private ComponentName componentName2;
//元旦元件名稱
private ComponentName componentName3;
private PackageManager mPackageManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//獲取到包管理類例項
mPackageManager = getPackageManager();
//這裡“com.hj.logo.MainActivity0”為包名.元件別名,一定要寫正確,否則會報“Component class com.*.* does not exist in com.*.*”元件不存在
componentName1 = new ComponentName(getBaseContext(), "com.hj.logo.MainActivity0");
componentName2 = new ComponentName(getBaseContext(), "com.hj.logo.MainActivity1");
componentName3 = new ComponentName(getBaseContext(), "com.hj.logo.MainActivity2");
}
/**
* 切換雙11logo
* @param view
*/
public void jump01(View view) {
enableComponent(componentName1);
disableComponent(componentName2);
disableComponent(componentName3);
}
/**
* 切換雙12logo
* @param view
*/
public void jump02(View view) {
enableComponent(componentName2);
disableComponent(componentName1);
disableComponent(componentName3);
}
/**
* 切換元旦logo
* @param view
*/
public void jump03(View view) {
enableComponent(componentName3);
disableComponent(componentName1);
disableComponent(componentName2);
}
/**
* 啟動元件
* @param componentName 元件名
*/
private void enableComponent(ComponentName componentName) {
//此方法用以啟用和禁用元件,會覆蓋Androidmanifest檔案下定義的屬性
mPackageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
}
/**
* 禁用元件
* @param componentName 元件名
*/
private void disableComponent(ComponentName componentName) {
mPackageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
}
}
爬過的坑:
- 研究時遇到了第一次切換logo時,app會自動關閉並回到桌面;看了好多文章沒有找到答案;打個比方,清單檔案中原有一個app入口的元件(A),加上雙11(B)、雙12(C)、元旦(D),總共4個入口元件,如果將A元件設定enabled=“true”預設也是true,其他BCD都為false,這種情況下會出現第一次切換會出現app自動關閉並回到桌面;解決辦法:將A元件預設就設定成false不可用,將BCD中的某一個設定成預設的入口元件(enabled=“true”),如上面程式碼中我將雙11這個入口設定成預設的入口;這樣在BCD中來回切換對應的元件LOGO和Label就可以了
- Activity class {com.***Activity} does not exist.遇到元件找不到的問題,這個可以看上一篇文章Activity class {com.***Activity} does not exist.
demo下載地址:
下載地址