`
coolerbaosi
  • 浏览: 766977 次
文章分类
社区版块
存档分类
最新评论

Android 点击桌面快捷方式和Notifycation跳转到Task栈顶Activity

 
阅读更多


转载时请注明出处:http://blog.csdn.net/xiaanming/article/details/9314193

我们一般下载的应用在第一次启动应用的时候都会给我创建一个桌面快捷方式,然后我在网上找了些资料整理下了,写了一个快捷方式的工具类,这样我们以后要创建快捷方式的时候直接拷贝这个类,里面提供了一些静态方法,主要的三个方法如下

1.addShortCut(Context context, String shortCutName, int resourceId, Class<?> cls)添加快捷方式的方法

2.delShortcut(Context context) 删除快捷方式的方法

3.hasShortcut(Context context)判断桌面上是否有该快捷方式的方法

工具类代码如下,使用这三个方法都需要添加相对于的权限,我在代码中也写的比较清楚

  1. packagecom.example.shortcut;
  2. importjava.util.List;
  3. importandroid.app.Activity;
  4. importandroid.content.ComponentName;
  5. importandroid.content.Context;
  6. importandroid.content.Intent;
  7. importandroid.content.Intent.ShortcutIconResource;
  8. importandroid.content.pm.PackageInfo;
  9. importandroid.content.pm.PackageManager;
  10. importandroid.content.pm.ProviderInfo;
  11. importandroid.content.pm.PackageManager.NameNotFoundException;
  12. importandroid.database.Cursor;
  13. importandroid.net.Uri;
  14. importandroid.text.TextUtils;
  15. /**
  16. *桌面快捷方式有关的工具类
  17. *@authorxiaanming
  18. *
  19. */
  20. publicclassShortCutUtils{
  21. /**
  22. *快捷方式添加的action
  23. */
  24. privatefinalstaticStringSHORTCUT_ADD_ACTION="com.android.launcher.action.INSTALL_SHORTCUT";
  25. /**
  26. *快捷方式删除的action
  27. */
  28. privatefinalstaticStringSHORTCUT_DEL_ACTION="com.android.launcher.action.UNINSTALL_SHORTCUT";
  29. /**
  30. *读取数据库需要的权限
  31. */
  32. privatefinalstaticStringREAD_SETTINGS_PERMISSION="com.android.launcher.permission.READ_SETTINGS";
  33. /**
  34. *添加快捷方式到桌面,添加快捷方式需要添加用户权限
  35. *<uses-permissionandroid:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
  36. *@paramcontext
  37. *@paramshortCutName
  38. *@paramresourceId
  39. *@paramcls
  40. */
  41. publicstaticvoidaddShortCut(Contextcontext,StringshortCutName,intresourceId,Class<?>cls){
  42. IntentshortCutIntent=newIntent(SHORTCUT_ADD_ACTION);
  43. //添加快捷方式的名字
  44. shortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME,shortCutName);
  45. //不允许重复添加
  46. shortCutIntent.putExtra("duplicate",false);
  47. //指定当前的Activity为快捷方式启动的对象
  48. shortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT,newIntent().setClass(context,cls));
  49. //添加快捷方式的图标
  50. ShortcutIconResourceiconRes=Intent.ShortcutIconResource.fromContext(context,resourceId);
  51. shortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,iconRes);
  52. context.sendBroadcast(shortCutIntent);
  53. }
  54. /**
  55. *删除桌面上的快捷方式,需要添加权限
  56. *<uses-permissionandroid:name="com.android.launcher.permission.UNINSTALL_SHORTCUT"/>
  57. *@paramcontext
  58. */
  59. publicstaticvoiddelShortcut(Contextcontext){
  60. Intentshortcut=newIntent(SHORTCUT_DEL_ACTION);
  61. //获取当前应用名称
  62. StringappName=null;
  63. try{
  64. appName=obtatinAppName(context);
  65. }catch(NameNotFoundExceptione){
  66. e.printStackTrace();
  67. }
  68. //快捷方式名称
  69. shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,appName);
  70. IntentshortcutIntent=context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
  71. shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT,shortcutIntent);
  72. context.sendBroadcast(shortcut);
  73. }
  74. /**
  75. *判断桌面上是否有快捷方式,调用此方法需要添加权限
  76. *<uses-permissionandroid:name="com.android.launcher.permission.READ_SETTINGS"/>
  77. *@paramcontext
  78. *@return
  79. *@throwsNameNotFoundException
  80. */
  81. publicstaticbooleanhasShortcut(Contextcontext){
  82. StringAUTHORITY=getAuthorityFromPermission(context,READ_SETTINGS_PERMISSION);
  83. if(AUTHORITY==null){
  84. returnfalse;
  85. }
  86. UriCONTENT_URI=Uri.parse("content://"+AUTHORITY+"/favorites?notify=true");
  87. StringappName=null;
  88. try{
  89. appName=obtatinAppName(context);
  90. }catch(NameNotFoundExceptione){
  91. e.printStackTrace();
  92. }
  93. Cursorc=context.getContentResolver().query(CONTENT_URI,newString[]{"title"},"title=?",newString[]{appName},null);
  94. if(c!=null&&c.getCount()>0){
  95. returntrue;
  96. }
  97. returnfalse;
  98. }
  99. /**
  100. *android系统桌面的基本信息由一个launcher.db的Sqlite数据库管理,里面有三张表
  101. *其中一张表就是favorites。这个db文件一般放在data/data/com.android.launcher(launcher2)文件的databases下
  102. *但是对于不同的rom会放在不同的地方
  103. *例如MIUI放在data/data/com.miui.home/databases下面
  104. *htc放在data/data/com.htc.launcher/databases下面
  105. *@paramcontext
  106. *@parampermission读取设置的权限READ_SETTINGS_PERMISSION
  107. *@return
  108. */
  109. privatestaticStringgetAuthorityFromPermission(Contextcontext,Stringpermission){
  110. if(TextUtils.isEmpty(permission)){
  111. returnnull;
  112. }
  113. List<PackageInfo>packs=context.getPackageManager().getInstalledPackages(PackageManager.GET_PROVIDERS);
  114. if(packs==null){
  115. returnnull;
  116. }
  117. for(PackageInfopack:packs){
  118. ProviderInfo[]providers=pack.providers;
  119. if(providers!=null){
  120. for(ProviderInfoprovider:providers){
  121. if(permission.equals(provider.readPermission)||permission.equals(provider.writePermission)){
  122. returnprovider.authority;
  123. }
  124. }
  125. }
  126. }
  127. returnnull;
  128. }
  129. /**
  130. *获取应用的名称
  131. *@paramcontext
  132. *@return
  133. *@throwsNameNotFoundException
  134. */
  135. privatestaticStringobtatinAppName(Contextcontext)throwsNameNotFoundException{
  136. PackageManagerpackageManager=context.getPackageManager();
  137. returnpackageManager.getApplicationLabel(packageManager.getApplicationInfo(context.getPackageName(),PackageManager.GET_META_DATA)).toString();
  138. }
  139. }


接下来我们来使用该工具类,我们在onCreate()的方法中先判断桌面上是否有该快捷方式,没有我们就创建一个快捷方式,然后提供一个删除快捷方式的按钮,代码还是比较简单,相信你很容易看懂的

  1. packagecom.example.shortcut;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.util.Log;
  5. importandroid.view.View;
  6. importandroid.view.View.OnClickListener;
  7. importandroid.widget.Button;
  8. publicclassMainActivityextendsActivityimplementsOnClickListener{
  9. privatefinalstaticStringTAG="Activity";
  10. @Override
  11. protectedvoidonCreate(BundlesavedInstanceState){
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.activity_main);
  14. Log.i(TAG,"onCreate");
  15. if(!ShortCutUtils.hasShortcut(this)){
  16. ShortCutUtils.addShortCut(this,getString(R.string.app_name),R.drawable.icon);
  17. }
  18. //删除快捷方式的按钮
  19. ButtonmButton=(Button)findViewById(R.id.delete);
  20. mButton.setOnClickListener(this);
  21. }
  22. @Override
  23. publicvoidonClick(Viewv){
  24. switch(v.getId()){
  25. caseR.id.delete:
  26. ShortCutUtils.delShortcut(this);
  27. break;
  28. default:
  29. break;
  30. }
  31. }
  32. }
这样子我们就添加好了快捷方法,可是你会发现

一、当我们进入MainActivity的时候,然后按HOME键进入后台,找到该桌面快捷方式点击,你会发现MainActivity的onCreate()被再一次的执行

二、你删掉我们添加的快捷方式,然后再应用主界面找到该应用图片,长按几秒钟,系统也会帮我们创建一个桌面快捷方式,你进入MainActivity,然后按HOME键,找到桌面快捷方式进入MainActivity,这时候你会发现,MainActivity的onCreate()方法没有被执行了显然第一种方式不是我们想要的,那怎么才能实现我们想要的第二种方式呢,别着急,我们只需要小小的修改一下,将上面的添加快捷方式Intent修改如下

  1. shortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT,newIntent()
  2. .setAction(Intent.ACTION_MAIN)
  3. .addCategory(Intent.CATEGORY_LAUNCHER)
  4. .setClass(context,cls));

设置好了,你在试一试,这时候你会发现,很应用列表长按的效果一样了,哈哈!

接下来我们来讨论下点击Notifycation的问题

我们点击一个按钮产生一个Notifycation,当我们点击Notifycation的时候,我们在onCreate()中调用如下方法来初始化Notifycation的有关东西

  1. /**
  2. *初始化Notifycation
  3. */
  4. privatevoidinitNotify(){
  5. nm=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
  6. n=newNotification();
  7. n.flags=Notification.FLAG_AUTO_CANCEL;;
  8. n.icon=R.drawable.notification_icon;
  9. n.when=System.currentTimeMillis();
  10. n.flags=Notification.FLAG_AUTO_CANCEL;
  11. n.defaults=Notification.DEFAULT_SOUND;
  12. n.tickerText="CSDN给你发来了一条消息,请查看!";
  13. Intentintent=newIntent().setClass(getApplication(),MainActivity.class);
  14. PendingIntentpi=PendingIntent.getActivity(this,0,intent,0);
  15. n.setLatestEventInfo(getApplication(),"我的微信","CSDN给你发来了一条消息,请查看!",pi);
  16. }
当我们产生通知的时候,点击通知进入MainActivity,此时的MainActivity并没有被销毁,我们发现MainActivity被重新创建了,这并不是我们想要的效果,可不可以做成如果Activity在栈中我们不重新创建,答案是肯定的,我们将上面的修改做类似的修改

  1. /**
  2. *初始化Notifycation
  3. */
  4. privatevoidinitNotify(){
  5. nm=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
  6. n=newNotification();
  7. n.flags=Notification.FLAG_AUTO_CANCEL;;
  8. n.icon=R.drawable.notification_icon;
  9. n.when=System.currentTimeMillis();
  10. n.flags=Notification.FLAG_AUTO_CANCEL;
  11. n.defaults=Notification.DEFAULT_SOUND;
  12. n.tickerText="CSDN给你发来了一条消息,请查看!";
  13. Intentintent=newIntent()
  14. .setAction(Intent.ACTION_MAIN)
  15. .addCategory(Intent.CATEGORY_LAUNCHER)
  16. .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  17. .setClass(getApplication(),MainActivity.class);
  18. PendingIntentpi=PendingIntent.getActivity(this,0,intent,0);
  19. n.setLatestEventInfo(getApplication(),"我的微信","CSDN给你发来了一条消息,请查看!",pi);
  20. }

问题就解决了,这个类似扣扣的效果,你点击Notifycation跳转到处于栈顶的Activity,这样是不是很方便呢,如果你觉得这篇文章对你有点帮助你就顶下,如果你发现错误请指出,谢谢!

上面那个创建快捷方式的工具类有点错误,不能删除创建的快捷方式,我将修改好的工具类贴在下面,也是完整的代码,直接可以用的

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();
	}

}

上面的有些代码不太完整代码下载

分享到:
评论

相关推荐

    Android 点击桌面快捷方式和Notifycation之后跳转到Task栈顶Activity

    1.点击桌面快捷方式进入到Task顶Activity 2.点击Notifycation进入到Task顶Activity 3.详情:http://blog.csdn.net/xiaanming/article/details/9312857

    android webview中html页面点击按钮跳转到activity

    当我们需要在Webview中实现HTML页面与原生Android应用的交互时,例如点击HTML按钮跳转到一个新的Activity,就需要利用到JavaScript接口和Android的WebViewClient。下面我们将详细探讨这一过程。 首先,我们需要在...

    Android Activity跳转和listview的使用

    总结来说,理解和掌握Intent、Bundle的使用是实现Activity间跳转的关键,而ListView则提供了展示大量数据的有效方式。通过Adapter和OnItemClickListener,我们可以实现ListView中Item的交互功能。同时,button点击...

    android实现activity跳转

    Activity间的跳转是Android应用中常见的操作,用于实现不同功能模块之间的切换。本篇将详细讲解如何在Android中实现Activity的跳转,以供初学者参考。 首先,我们需要了解Intent对象。Intent是Android系统中的一个...

    android:scheme 通过uri跳转到APP应用指定Activity

    下面我们将详细探讨如何使用`android:scheme`来实现URI跳转到APP应用指定的Activity。 首先,我们来创建自定义的URL scheme。在AndroidManifest.xml文件中,我们需要声明我们的Activity并为其设置一个唯一的scheme...

    android代码 Activity跳转

    在Android应用开发中,Activity是应用程序的基本组件,用于展示用户界面和处理用户交互。Activity间的跳转是Android应用中常见的操作,它允许用户在不同的功能模块间自由切换。本篇文章将详细讲解如何在Android中...

    安卓启动时快速跳转到指定activity

    在Android开发中,启动应用程序并快速跳转到指定的Activity是一项常见的需求,特别是在实现自定义启动页或者处理特定启动逻辑时。本知识点将详细讲解如何在Android应用启动时实现这一功能。 首先,我们需要理解...

    Android应用源码之(Activity跳转与操作).zip

    Activity跳转与操作是Android开发者必须掌握的关键技能,涉及到Intent、生命周期、数据传递等多个方面。本资源“Android应用源码之(Activity跳转与操作).zip”包含了关于这些主题的实例代码,下面将详细解释这些知识...

    android之activity跳转 窗口跳转

    此外,为了实现Activity的返回栈管理,Android使用了Task和Back Stack的概念。当一个Activity启动另一个Activity时,新的Activity会被压入栈顶,按后进先出(LIFO)原则处理。按下Back键时,栈顶的Activity会被弹出...

    Android 中从activity1跳转到activity2再回到activity所经历的生命周期

    ### Android 中从Activity1跳转到Activity2再回到Activity1所经历的生命周期 在Android开发过程中,理解Activity的生命周期对于管理界面状态、处理用户交互以及响应系统事件至关重要。本文将详细解析从一个Activity...

    android 快捷方式的权限判断。

    在Android系统中,快捷方式是一种方便用户快速启动应用或跳转至特定功能的方式。随着不同手机厂商对Android系统的定制,各个品牌如华为、小米、OPPO、vivo等可能有自己的快捷方式实现。为了确保应用能够正常创建和...

    Android 单击实现页面跳转

    在Android应用开发中,页面跳转是用户交互中不可或缺的一部分,它使得用户能够在不同的Activity之间进行切换,体验应用的不同功能。本教程将详细介绍如何在Android中实现单击事件触发的页面跳转。 首先,我们需要...

    Android源程序实现两个Activity之间的跳转

    ### Android源程序实现两个Activity之间的跳转 在Android开发中,`Activity`是构成应用程序的基本单元之一,负责处理用户交互并展示界面。本文将详细解释如何通过代码实现两个`Activity`之间的跳转,并分析给定的`...

    android 运算器 不同activity间的跳转

    当我们谈论"不同Activity间的跳转"时,我们实际上是在讨论如何在Android应用中从一个屏幕导航到另一个屏幕。在这个过程中,通常会涉及到Intent对象的使用,Intent是Android系统用来启动或与服务进行交互的一种机制。...

    安卓Android源码——(Activity跳转与操作).zip

    这个压缩包文件“安卓Android源码——(Activity跳转与操作).zip”显然专注于讲解如何在Android系统中进行Activity的跳转和操作。以下是关于这个主题的详细知识点: 一、Activity生命周期 1. Activity有七个关键状态...

    webview+html跳转activity

    总结起来,"webview+html跳转activity"涉及的核心知识点包括:WebView的使用、JavaScript与Android的交互、页面事件处理以及安全性和性能优化。在实际开发中,这些技术能够帮助我们构建功能丰富的混合式应用程序,...

    android入门activity跳转源代码

    在Android开发中,Activity是应用程序的基本构建块,用于展示用户界面和处理用户交互。Activity跳转是Android应用中常见的操作,用于在不同的界面之间切换。本篇将详细讲解`android入门activity跳转源代码`的相关...

    Activity之间的跳转项目案例实现

    在Android应用开发中,Activity是构成应用程序的基本单元,它代表了用户可以交互的一个屏幕。"Activity之间的跳转项目案例实现"这个主题主要关注如何在不同的Activity之间切换,并且在跳转过程中传递数据。这里我们...

    android activity各种方式跳转 经典完整代码

    本篇文章将详细介绍Android中Activity的各种跳转方式及其相关代码。 1. **意图(Intent)**:Intent是Android中用于启动或启动Activity的主要手段,它包含了启动目标Activity所需的信息。有显式Intent和隐式Intent两...

    035_android_Activity入门和跳转

    Android系统使用任务(Task)和栈(BackStack)来管理Activity。新启动的Activity会被压入栈顶,当按下Back键时,栈顶的Activity会被弹出,呈现出栈底的Activity。理解这一机制有助于避免回退过程中的异常。 9. ...

Global site tag (gtag.js) - Google Analytics