创建Android快捷方式牛刀小试
写博客完全是为了自己方便作总结。
首先贴效果图:
创建2个快捷方式,分别是one和two。
主界面(MainiAcivity),它的不是满屏的,类似一个Dialog。
在主界面点击去第一个页面,显示的也不是满屏的
在主界面点击去第二个页面,显示的是满屏的,从快捷方式进来也是满屏的。
从快捷方式进入OneActivity,显示是满屏的。
以上是效果,主要用于区分。
需求:
1:创建2个快捷方式,删除后不需要再创建。
2:主页面不是满屏的。悬浮于手机界面。
3:从主页面到OneActivity界面,2个界面长和宽是一致的,但是从快捷方式进入到OneActivity界面,要求是满屏显示。
4:从主页面到TwoActivity界面,全部都是满屏显示。
实现过程:
1:创建2个快捷方式,删除后不需要再创建。
实现代码:
主要是通过Intent和发送广播实现。
private void addShortCut(String title, Class<?> clzz) {
Intent addIntent = new Intent();
Intent shortCutIntent = new Intent(this, clzz);
//作标记
shortCutIntent.putExtra(Constance.DESKTOP, title);
shortCutIntent.setAction(Intent.ACTION_VIEW);
addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortCutIntent);
addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, title);
addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
Intent.ShortcutIconResource.fromContext(this, R.drawable.ic_launcher));
// 设置不可重复创建快捷方式
addIntent.putExtra("duplicate", false);
addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
sendBroadcast(addIntent);
}
虽然设置创建快捷方式的时候设置了不可重复创建快捷方式(”duplicate”, false),但是如果移除了快捷方式,点击创建快捷方式还是会再创建一次。所以单纯这样做还是不行的。
如果在手机记录创建快捷方式成功,并且以后不再创建,简单的可以使用SharedPreferences,但是大家都知道,如果用户手动清除应用数据,那这个就不是很保险了,所以在这里加上在用户手机sd卡创建一个文件,如果文件存在则不创建,但是如果用户不小心删除文件,那就over了,所以大家可以自己想法子对付这个问题。我这里就是用SharedPreferences和创建文件结合起来做判断的。
private void createShortCut() {
// 确保唯一性,如果sd卡有这个文件或者sp已存储,则不再创建
if (TextUtils.isEmpty(ToolUtil.getStoreValue(this, "isCreate"))
&& !new File(ToolUtil.getSDCardPath() + "/RE/er").exists()) {
// 存在sp里
ToolUtil.storeValue(this, "isCreate", "true");
// 创建文件
File file = new File(ToolUtil.getSDCardPath() + "/RE/er");
try {
file.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String onePage = getResources().getString(R.string.str_one);
String twoPage = getResources().getString(R.string.str_two);
if (!ToolUtil.hasShortcut(getApplicationContext(), onePage)) { //
// 创建one page快捷方式
addShortCut(onePage, OneActivity.class);
}
if (!ToolUtil.hasShortcut(getApplicationContext(), twoPage)) {
// 创建two page快捷方式
addShortCut(twoPage, TwoActivity.class);
}
} else {
Toast.makeText(getApplicationContext(), getResources().getString(R.string.str_created), Toast.LENGTH_LONG)
.show();
}
}
hasShortcut是判断桌面上是否有同个名字的快捷方式,如果存在则不创建。
/**
* 判断桌面上是否有快捷方式,调用此方法需要添加权限 <uses-permission android:name=
* "com.android.launcher.permission.READ_SETTINGS" />
*
* @param context
* @return
* @throws NameNotFoundException
*/
public static boolean hasShortcut(Context context, String appName) {
String AUTHORITY = getAuthorityFromPermission(context, READ_SETTINGS_PERMISSION);
if (AUTHORITY == null) {
return false;
}
Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/favorites?notify=true");
try {
if (appName == null) {
// 获取当前应用名称
appName = obtatinAppName(context);
}
} catch (Throwable e) {
Log.e("ShortCutUtils==>hasShortcut", "NameNotFoundException :" + e.toString());
}
Cursor c = context.getContentResolver().query(CONTENT_URI, new String[] { "title" }, "title=?",
new String[] { appName }, null);
if (c != null && c.getCount() > 0) {
return true;
}
return false;
}
记得在Androidminifest的activity加上intent-filter属性,否则会提示应用未安装。
<activity
android:name=".OneActivity"
android:label="@string/title_activity_one"
android:taskAffinity="com.example.shortcutdemo.OneActivity"
android:theme="@style/Dialog" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
最后还要记得添加创建快捷方式的各种权限:
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.android.launcher2.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher2.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.android.launcher3.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher3.permission.WRITE_SETTINGS" />
<uses-permission android:name="org.adw.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="org.adw.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.htc.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.htc.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.qihoo360.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.qihoo360.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.lge.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.lge.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="net.qihoo.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="net.qihoo.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="org.adwfreak.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="org.adwfreak.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="org.adw.launcher_donut.permission.READ_SETTINGS" />
<uses-permission android:name="org.adw.launcher_donut.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.huawei.launcher3.permission.READ_SETTINGS" />
<uses-permission android:name="com.huawei.launcher3.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.fede.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.fede.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.sec.android.app.twlauncher.settings.READ_SETTINGS" />
<uses-permission android:name="com.sec.android.app.twlauncher.settings.WRITE_SETTINGS" />
<uses-permission android:name="com.anddoes.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.anddoes.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.tencent.qqlauncher.permission.READ_SETTINGS" />
<uses-permission android:name="com.tencent.qqlauncher.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.huawei.launcher2.permission.READ_SETTINGS" />
<uses-permission android:name="com.huawei.launcher2.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.android.mylauncher.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.mylauncher.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.ebproductions.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.ebproductions.android.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.oppo.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.oppo.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.huawei.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.huawei.android.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="telecom.mdesk.permission.READ_SETTINGS" />
<uses-permission android:name="telecom.mdesk.permission.WRITE_SETTINGS" />
<uses-permission android:name="dianxin.permission.ACCESS_LAUNCHER_DATA" />
2:主页面不是满屏的,悬浮于手机界面。
设置Style:
<style name="Dialog" parent="android:style/Theme.Dialog">
<!-- 标题 -->
<item name="android:windowNoTitle">true</item>
<item name="android:windowFrame">@null</item>
<!-- 边框 -->
<item name="android:windowIsFloating">true</item>
<!-- 是否浮现在activity之上 -->
<item name="android:windowIsTranslucent">true</item>
<!-- 半透明 -->
<item name="android:background">@android:color/transparent</item>
<!-- 背景透明 -->
<item name="android:windowBackground">@android:color/transparent</item>
<!-- 背景透明 -->
<item name="android:backgroundDimEnabled">false</item>
<!-- 蒙版- 模糊 -->
</style>
3:从主页面到OneActivity界面,2个界面长和宽是一致的,但是从快捷方式进入到OneActivity界面,要求是满屏显示。
这里要求OneActivity一个界面有2种不同的显示形式,可以用setTheme()来实现,但是setTheme()要在setContentView()之前完成,否则无效。
设置OneActivity默认的Theme为Dialog。
但是界面的长和宽须得和主界面一致,因为我设置主界面的width和height为300dp,但是在代码里设置就要转换成px。
// 从MainActivity进到oneActivity,设置oneActivity的宽高与MainActivity大小一致
if (TextUtils.isEmpty(desktopStr)) {
int width = ToolUtil.sp2px(getApplicationContext(), 300);
int height = ToolUtil.sp2px(getApplicationContext(), 300);
RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(width, height);
oneLayout.setLayoutParams(p);
}
满屏显示的style:
<style name="NoTitleAppTheme" parent="AppBaseTheme">
<item name="android:windowNoTitle">true</item>
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
</style>
到这里呢,前面创建快捷方式做的标记就有用处了,
shortCutIntent.putExtra(Constance.DESKTOP, title);
private void setActivityTheme() {
Bundle bundle = getIntent().getBundleExtra(Constance.BUNDLE_KEY_ARGS);
if (bundle != null) {
whereFrom = bundle.getInt(Constance.NOTE_FROMWHERE_KEY, Constance.QUICK_DIALOG);
}
// 点击快捷方式进入OneActivity
desktopStr = getIntent().getStringExtra(Constance.DESKTOP);
if (!TextUtils.isEmpty(desktopStr)) {
this.setTheme(R.style.NoTitleAppTheme);
}
}
4:从主页面到TwoActivity界面,全部都是满屏显示。
这个TwoActivity界面只要设置Theme为NoTitleAppTheme就好了。
值得注意的一点是大家会发现使用快捷方式的时候会有些错乱的感觉,就是点击主页面–>点去第一个界面–>点Home键–>点one快捷方式–>返回,居然不是返回桌面(不知道大家有没有遇到过),反正很奇怪的现象。
这里给大家一个建议就是给activity设置taskAffinity:
<activity
android:name=".OneActivity"
android:label="@string/title_activity_one"
android:taskAffinity="com.example.shortcutdemo.OneActivity"
android:theme="@style/Dialog" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
以上就是全部了,如有错误,欢迎大家指出。