全志H2H3方案里的方法是:
device\softwinner\dolphin-fvd-p1\dolphin_fvd_p2.mk
在变量PRODUCT_PROPERTY_OVERRIDES添加
PRODUCT_PROPERTY_OVERRIDES += \
ro.sw.defaultlauncherpackage=com.android.launcher \
ro.sw.defaultlauncherclass=com.android.launcher2.Launcher
最终在/system/build.prop 文件生成这2个属性:
ro.sw.defaultlauncherpackage=com.android.launcher
ro.sw.defaultlauncherclass=com.android.launcher2.Launcher
使用H3文档里面说的方法,虽然H5的代码ActivityMangerService里面有 setDefaultLauncher()方法,
但是没有效果。找了网上类似的方法也没有用。最后我是这样改的:
修改
frameworks\base\services\core\java\com\android\server\am\ActivityMangerService.java
在boolean startHomeActivityLocked(int userId, String reason) {
中添加
if(aInfo == null){
intent = getHomeIntent();
aInfo =resolveActivityInfo(intent, STOCK_PM_FLAGS, userId);
}
//add by zhaoyf start
PackageManager pm = mContext.getPackageManager();
Intent newintent = new Intent(Intent.ACTION_MAIN);
newintent.addCategory(Intent.CATEGORY_HOME);
List<ResolveInfo> resolveInfoList = pm.queryIntentActivities(newintent, 0);
//判断带有Intent.CATEGORY_HOME标签的所有activity中如果有你指定的activity则替换
if(resolveInfoList != null){
int size = resolveInfoList.size();
for(int i = 0; i < size; i++){
ResolveInfo rInfo = resolveInfoList.get(i);
if(rInfo.activityInfo.name.equals("com.ider.launcher.MainActivity")){//设置自己的Launcher
aInfo = rInfo.activityInfo;
}
}
}
//add by zhaoyf stop
intent.setComponent(new ComponentName(
aInfo.applicationInfo.packageName, aInfo.name));
// Don't do this if the home app is currently being
// instrumented.
aInfo = new ActivityInfo(aInfo);
aInfo.applicationInfo = getAppInfoForUser(aInfo.applicationInfo, userId);
ProcessRecord app = getProcessRecordLocked(aInfo.processName,
aInfo.applicationInfo.uid, true);
if (app == null || app.instrumentationClass == null) {
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK);
//这里启动你已替换过的activity
mStackSupervisor.startHomeActivity(intent, aInfo);
}
}
return true;
}
在PhoneWindowManager.java 中添加
public void init(Context context, IWindowManager windowManager,
WindowManagerFuncs windowManagerFuncs) {
......
mHomeIntent = new Intent(Intent.ACTION_MAIN, null);
mHomeIntent.addCategory(Intent.CATEGORY_HOME);
//add by zhaoyf start
//需要默认的Launcher
ComponentName mHomecom = new ComponentName("com.android.launcher3", "com.android.launcher3.Launcher");
mHomeIntent.setComponent(mHomecom);
//add zhaoyf stop
mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
......
}
OK就是这样了
==================2018.12.22==================
上面的做法虽然能保证每次开机进入到默认的Launcher,而且按Home键回到默认的Launcher,(需要在PhoneWindowManager里面加上Home键监听)
可以满足大多数要求,但是由于默认Home是没有锁定的,这样会有一个问题,比如有的APK在退出时会做一番处理,通过隐式调用Home启动Activity,这样就会出现Home选择列表了。
所以需要通过下面这种方法可以锁定自己的Launcher为默认的Home
在 frameworks/base/core/java/com/android/internal/app/ResolverActivity.java 中作修改
根据需要默认Launcher来设置默认
//add++++++++++++++++++
private void setDefaultLauncher(String defPackageName,String defClassName) {
if ((defPackageName != null && defPackageName.trim().length() > 1) && (defClassName != null && defClassName.trim().length() > 0)) {
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.MAIN");
filter.addCategory("android.intent.category.HOME");
filter.addCategory("android.intent.category.DEFAULT");
Intent intent=new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
List<ResolveInfo> list = new ArrayList<ResolveInfo>();
list = getPackageManager().queryIntentActivities(intent, 0);
final int N = list.size();
ComponentName[] set = new ComponentName[N];
int bestMatch = 0;
for (int i=0; i<N; i++) {
ResolveInfo r = list.get(i);
set[i] = new ComponentName(r.activityInfo.packageName,
r.activityInfo.name);
if (r.match > bestMatch) bestMatch = r.match;
}
ComponentName preActivity = new ComponentName(defPackageName, defClassName);
getPackageManager().addPreferredActivity(filter, bestMatch, set,preActivity);
}
}
//add++++++++++++++++++end
在onCreate方法中添加调用
protected void onCreate(Bundle savedInstanceState) {
//add++++++++++++
boolean firstBoot = (Settings.System.getInt(getApplication().getContentResolver(),
Settings.System.DEFAULT_HOME_SETTING_CHANGED, 0) == 0);
if(firstBoot){
String defPackageName = "com.panasonic.india.flexuihome";
String defClassName = "com.panasonic.india.flexuihome.Launcher";
setDefaultLauncher(defPackageName,defClassName);
android.util.Log.i("deflauncher : ","deflauncher : PackageName = "+
defPackageName+" ClassName = "+defClassName);
Intent defIntent = new Intent();
defIntent.setClassName(defPackageName, defClassName);
defIntent.setAction("android.intent.action.MAIN");
defIntent.addCategory("android.intent.category.HOME");
defIntent.addCategory("android.intent.category.DEFAULT");
startActivity(defIntent);
Settings.System.putInt(getApplication().getContentResolver(),
Settings.System.DEFAULT_HOME_SETTING_CHANGED,1);
this.finish();
}
//add++++++++++++end
// Use a specialized prompt when we're handling the 'Home' app startActivity()
final int titleResource;
final Intent intent = makeMyIntent();
final Set<String> categories = intent.getCategories();
if (Intent.ACTION_MAIN.equals(intent.getAction())
&& categories != null
&& categories.size() == 1
&& categories.contains(Intent.CATEGORY_HOME)) {
titleResource = com.android.internal.R.string.whichHomeApplication;
} else {
titleResource = com.android.internal.R.string.whichApplication;
}
onCreate(savedInstanceState, intent, getResources().getText(titleResource),
null, null, true);
}
DEFAULT_HOME_SETTING_CHANGED的设置
在core/java/android/provider/Settings.java的public static final class System extends NameValueTable{}中添加
public static final String DEFAULT_HOME_SETTING_CHANGED = "default_home_setting_changed";
packages/SettingsProvider/res/values/defaults.xml中添加
<integer name="default_launcher_value">0</integer>
packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
在private void loadSystemSettings(SQLiteDatabase db){}中添加中添加
loadIntegerSetting(stmt, Settings.System.DEFAULT_HOME_SETTING_CHANGED, R.integer.default_launcher_value);
这种方式是在第一次开机的时候,在ResolverActivity的onCreate方法中调用setDefaultLauncher()来设置默认的Launcher
这样还有一个问题:在系统Settings的Application里面可以找到所有APP的列表,点击任意一个Home类的APP,里面都有默认Home这一项,点击之后还是可以修改默认的Launcher.要测地解决可能需要隐藏掉这个选项,或者直接隐藏掉home类的APP,不让他们出现在所有列表里面,这样用户就彻底没有办法修改默认主页了。这个有待进一步去研究。
迫于时间仓促,产品急于要软件,暂时只能是修改Home键的监听,默认调用自己的Launcher
在PhoneWindowManager里面的init()修改,加上home键监听
/** {@inheritDoc} */
@Override
public void init(Context context, IWindowManager windowManager,
WindowManagerFuncs windowManagerFuncs) {
mHomeIntent = new Intent(Intent.ACTION_MAIN, null);
mHomeIntent.addCategory(Intent.CATEGORY_HOME);
//add by zhaoyf start
ComponentName mHomecom = new ComponentName("com.ider.launcherpackage", "com.ider.launcherpackage.launcher.MainActivity");
mHomeIntent.setComponent(mHomecom);
//add zhaoyf stop
mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);