当前app有两个Task,Task A & Task B,当前显示TaskB中的Activity,按Home键回到桌面,按桌面icon进入,进入到的是TaskA栈顶的Activity,需求是会显示TaskB栈顶的Activity,怎么做?
1条回答 默认 最新
- Mr_shaopengjie 2015-03-26 01:48关注
主要有3个方法:
1.addShortCut(Context context, String shortCutName, int resourceId, Class<?> cls)添加快捷方式的方法
2.delShortcut(Context context) 删除快捷方式的方法
3.hasShortcut(Context context)判断桌面上是否有该快捷方式的方法package com.example.shortcut; import java.util.List; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.Intent.ShortcutIconResource; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ProviderInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.database.Cursor; import android.net.Uri; import android.text.TextUtils; /** * 桌面快捷方式有关的工具类 * @author xiaanming * */ public class ShortCutUtils { /** * 快捷方式添加的action */ private final static String SHORTCUT_ADD_ACTION = "com.android.launcher.action.INSTALL_SHORTCUT"; /** * 快捷方式删除的action */ private final static String SHORTCUT_DEL_ACTION = "com.android.launcher.action.UNINSTALL_SHORTCUT"; /** * 读取数据库需要的权限 */ private final static String READ_SETTINGS_PERMISSION = "com.android.launcher.permission.READ_SETTINGS"; /** * 添加快捷方式到桌面,添加快捷方式需要添加用户权限 * <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /> * @param context * @param shortCutName * @param resourceId * @param cls */ public static void addShortCut(Context context, String shortCutName, int resourceId, Class<?> cls){ Intent shortCutIntent = new Intent(SHORTCUT_ADD_ACTION); //添加快捷方式的名字 shortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, shortCutName); //不允许重复添加 shortCutIntent.putExtra("duplicate", false); //指定当前的Activity为快捷方式启动的对象 shortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent().setClass(context, cls)); //添加快捷方式的图标 ShortcutIconResource iconRes = Intent.ShortcutIconResource.fromContext(context, resourceId); shortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconRes); context.sendBroadcast(shortCutIntent); } /** * 删除桌面上的快捷方式,需要添加权限 * <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" /> * @param context */ public static void delShortcut(Context context) { Intent shortcut = new Intent(SHORTCUT_DEL_ACTION); // 获取当前应用名称 String appName = null; try { appName = obtatinAppName(context); } catch (NameNotFoundException e) { e.printStackTrace(); } // 快捷方式名称 shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, appName); Intent shortcutIntent = context.getPackageManager() .getLaunchIntentForPackage(context.getPackageName()); shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); context.sendBroadcast(shortcut); } /** * 判断桌面上是否有快捷方式,调用此方法需要添加权限 * <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> * @param context * @return * @throws NameNotFoundException */ public static boolean hasShortcut(Context context) { String AUTHORITY = getAuthorityFromPermission(context, READ_SETTINGS_PERMISSION); if (AUTHORITY == null) { return false; } Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/favorites?notify=true"); String appName = null; try { appName = obtatinAppName(context); } catch (NameNotFoundException e) { e.printStackTrace(); } 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; } /** * android系统桌面的基本信息由一个launcher.db的Sqlite数据库管理,里面有三张表 * 其中一张表就是favorites。这个db文件一般放在data/data/com.android.launcher(launcher2)文件的databases下 * 但是对于不同的rom会放在不同的地方 * 例如MIUI放在data/data/com.miui.home/databases下面 * htc放在data/data/com.htc.launcher/databases下面 * @param context * @param permission 读取设置的权限 READ_SETTINGS_PERMISSION * @return */ private static String getAuthorityFromPermission(Context context, String permission) { if (TextUtils.isEmpty(permission)) { return null; } List<PackageInfo> packs = context.getPackageManager().getInstalledPackages(PackageManager.GET_PROVIDERS); if (packs == null) { return null; } for (PackageInfo pack : packs) { ProviderInfo[] providers = pack.providers; if (providers != null) { for (ProviderInfo provider : providers) { if (permission.equals(provider.readPermission)|| permission.equals(provider.writePermission)) { return provider.authority; } } } } return null; } /** * 获取应用的名称 * @param context * @return * @throws NameNotFoundException */ private static String obtatinAppName(Context context) throws NameNotFoundException{ PackageManager packageManager = context.getPackageManager(); return packageManager.getApplicationLabel(packageManager.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA)).toString(); } }
接下来我们来使用该工具类,我们在onCreate()的方法中先判断桌面上是否有该快捷方式,没有我们就创建一个快捷方式,然后提供一个删除快捷方式的按钮,代码还是比较简单,相信你很容易看懂的
[java] view plaincopy
package com.example.shortcut; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity implements OnClickListener{ private final static String TAG = "Activity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i(TAG, "onCreate"); if(! ShortCutUtils.hasShortcut(this)){ ShortCutUtils.addShortCut(this, getString(R.string.app_name), R.drawable.icon); } //删除快捷方式的按钮 Button mButton = (Button) findViewById(R.id.delete); mButton.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.delete: ShortCutUtils.delShortcut(this); break; default: break; } } }
这样子我们就添加好了快捷方法,可是你会发现
一、当我们进入MainActivity的时候,然后按HOME键进入后台,找到该桌面快捷方式点击,你会发现MainActivity的onCreate()被再一次的执行
二、你删掉我们添加的快捷方式,然后再应用主界面找到该应用图片,长按几秒钟,系统也会帮我们创建一个桌面快捷方式,你进入MainActivity,然后按HOME键,找到桌面快捷方式进入MainActivity,这时候你会发现,MainActivity的onCreate()方法没有被执行了显然第一种方式不是我们想要的,那怎么才能实现我们想要的第二种方式呢,别着急,我们只需要小小的修改一下,将上面的添加快捷方式Intent修改如下
[java] view plaincopy
shortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent() .setAction(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_LAUNCHER) .setClass(context, cls));
设置好了,你在试一试,这时候你会发现,很应用列表长按的效果一样了,哈哈!
接下来我们来讨论下点击Notifycation的问题
我们点击一个按钮产生一个Notifycation,当我们点击Notifycation的时候,我们在onCreate()中调用如下方法来初始化Notifycation的有关东西
[java] view plaincopy
/** * 初始化Notifycation */ private void initNotify(){ nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); n = new Notification(); n.flags = Notification.FLAG_AUTO_CANCEL;; n.icon = R.drawable.notification_icon; n.when = System.currentTimeMillis(); n.flags = Notification.FLAG_AUTO_CANCEL; n.defaults = Notification.DEFAULT_SOUND; n.tickerText = "CSDN给你发来了一条消息,请查看!"; Intent intent = new Intent().setClass(getApplication(), MainActivity.class); PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0); n.setLatestEventInfo(getApplication(), "我的微信", "CSDN给你发来了一条消息,请查看!", pi); }
当我们产生通知的时候,点击通知进入MainActivity,此时的MainActivity并没有被销毁,我们发现MainActivity被重新创建了,这并不是我们想要的效果,可不可以做成如果Activity在栈中我们不重新创建,答案是肯定的,我们将上面的修改做类似的修改
[java] view plaincopy
/** * 初始化Notifycation */ private void initNotify(){ nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); n = new Notification(); n.flags = Notification.FLAG_AUTO_CANCEL;; n.icon = R.drawable.notification_icon; n.when = System.currentTimeMillis(); n.flags = Notification.FLAG_AUTO_CANCEL; n.defaults = Notification.DEFAULT_SOUND; n.tickerText = "CSDN给你发来了一条消息,请查看!"; Intent intent = new Intent() .setAction(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_LAUNCHER) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) .setClass(getApplication(), MainActivity.class); PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0); n.setLatestEventInfo(getApplication(), "我的微信", "CSDN给你发来了一条消息,请查看!", pi); }
问题就解决了,这个类似扣扣的效果,你点击Notifycation跳转到处于栈顶的Activity,这样是不是很方便呢,如果你觉得这篇文章对你有点帮助你就顶下,如果你发现错误请指出,谢谢!
上面那个创建快捷方式的工具类有点错误,不能删除创建的快捷方式,我将修改好的工具类贴在下面,也是完整的代码,直接可以用的
[java] view plaincopy在CODE上查看代码片派生到我的代码片
package com.example.shortcut; import java.util.List; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.Intent.ShortcutIconResource; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ProviderInfo; import android.database.Cursor; import android.net.Uri; import android.text.TextUtils; /** * 桌面快捷方式有关的工具类 * @author xiaanming * */ public class ShortCutUtils { /** * 快捷方式添加的action */ private final static String SHORTCUT_ADD_ACTION = "com.android.launcher.action.INSTALL_SHORTCUT"; /** * 快捷方式删除的action */ private final static String SHORTCUT_DEL_ACTION = "com.android.launcher.action.UNINSTALL_SHORTCUT"; /** * 读取数据库需要的权限 */ private final static String READ_SETTINGS_PERMISSION = "com.android.launcher.permission.READ_SETTINGS"; /** * 添加快捷方式到桌面,添加快捷方式需要添加用户权限 * <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /> * @param context 当前的context对象 * @param resourceId 快捷方式的图标资源id */ public static void addShortCut(Context context, int resourceId){ Intent shortCutIntent = new Intent(SHORTCUT_ADD_ACTION); //添加快捷方式的名字 // 获取当前应用名称 String appName = null; try { appName = obtatinAppName(context); } catch (NameNotFoundException e) { e.printStackTrace(); } shortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, appName); //不允许重复添加 shortCutIntent.putExtra("duplicate", false); shortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_LAUNCHER).setClassName(context.getPackageName(), context.getClass().getName())); //添加快捷方式的图标 ShortcutIconResource iconRes = Intent.ShortcutIconResource.fromContext(context, resourceId); shortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconRes); context.sendBroadcast(shortCutIntent); } /** * 删除桌面上的快捷方式,需要添加权限 * <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" /> * @param context */ public static void delShortcut(Context context, Activity activity) { Intent shortcut = new Intent(SHORTCUT_DEL_ACTION); // 获取当前应用名称 String appName = null; try { appName = obtatinAppName(context); } catch (NameNotFoundException e) { e.printStackTrace(); } // 快捷方式名称 shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, appName); shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_LAUNCHER).setClassName(context.getPackageName(), context.getClass().getName())); context.sendBroadcast(shortcut); } /** * 判断桌面上是否有快捷方式,调用此方法需要添加权限 * <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> * @param context * @return * @throws NameNotFoundException */ public static boolean hasShortcut(Context context) { String AUTHORITY = getAuthorityFromPermission(context, READ_SETTINGS_PERMISSION); System.out.println(AUTHORITY); if (AUTHORITY == null) { return false; } Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/favorites?notify=true"); String appName = null; try { appName = obtatinAppName(context); } catch (NameNotFoundException e) { e.printStackTrace(); } 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; } /** * android系统桌面的基本信息由一个launcher.db的Sqlite数据库管理,里面有三张表 * 其中一张表就是favorites。这个db文件一般放在data/data/com.android.launcher(launcher2)文件的databases下 * 但是对于不同的rom会放在不同的地方 * 例如MIUI放在data/data/com.miui.home/databases下面 * htc放在data/data/com.htc.launcher/databases下面 * @param context * @param permission 读取设置的权限 READ_SETTINGS_PERMISSION * @return */ private static String getAuthorityFromPermission(Context context, String permission) { if (TextUtils.isEmpty(permission)) { return null; } List<PackageInfo> packs = context.getPackageManager().getInstalledPackages(PackageManager.GET_PROVIDERS); if (packs == null) { return null; } for (PackageInfo pack : packs) { ProviderInfo[] providers = pack.providers; if (providers != null) { for (ProviderInfo provider : providers) { if (permission.equals(provider.readPermission)|| permission.equals(provider.writePermission)) { return provider.authority; } } } } return null; } /** * 获取应用的名称 * @param context * @return * @throws NameNotFoundException */ private static String obtatinAppName(Context context) throws NameNotFoundException{ PackageManager packageManager = context.getPackageManager(); return packageManager.getApplicationLabel(packageManager.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA)).toString(); } } 代码不太完整 也不知道是不是你需要的效果 你可以试试
解决 无用评论 打赏 举报
悬赏问题
- ¥15 如何在scanpy上做差异基因和通路富集?
- ¥20 关于#硬件工程#的问题,请各位专家解答!
- ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
- ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
- ¥30 截图中的mathematics程序转换成matlab
- ¥15 动力学代码报错,维度不匹配
- ¥15 Power query添加列问题
- ¥50 Kubernetes&Fission&Eleasticsearch
- ¥15 報錯:Person is not mapped,如何解決?
- ¥15 c++头文件不能识别CDialog