- 浏览: 4170865 次
最新评论
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)判断桌面上是否有该快捷方式的方法
工具类代码如下,使用这三个方法都需要添加相对于的权限,我在代码中也写的比较清楚
- packagecom.example.shortcut;
- importjava.util.List;
- importandroid.app.Activity;
- importandroid.content.ComponentName;
- importandroid.content.Context;
- importandroid.content.Intent;
- importandroid.content.Intent.ShortcutIconResource;
- importandroid.content.pm.PackageInfo;
- importandroid.content.pm.PackageManager;
- importandroid.content.pm.ProviderInfo;
- importandroid.content.pm.PackageManager.NameNotFoundException;
- importandroid.database.Cursor;
- importandroid.net.Uri;
- importandroid.text.TextUtils;
- /**
- *桌面快捷方式有关的工具类
- *@authorxiaanming
- *
- */
- publicclassShortCutUtils{
- /**
- *快捷方式添加的action
- */
- privatefinalstaticStringSHORTCUT_ADD_ACTION="com.android.launcher.action.INSTALL_SHORTCUT";
- /**
- *快捷方式删除的action
- */
- privatefinalstaticStringSHORTCUT_DEL_ACTION="com.android.launcher.action.UNINSTALL_SHORTCUT";
- /**
- *读取数据库需要的权限
- */
- privatefinalstaticStringREAD_SETTINGS_PERMISSION="com.android.launcher.permission.READ_SETTINGS";
- /**
- *添加快捷方式到桌面,添加快捷方式需要添加用户权限
- *<uses-permissionandroid:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
- *@paramcontext
- *@paramshortCutName
- *@paramresourceId
- *@paramcls
- */
- publicstaticvoidaddShortCut(Contextcontext,StringshortCutName,intresourceId,Class<?>cls){
- IntentshortCutIntent=newIntent(SHORTCUT_ADD_ACTION);
- //添加快捷方式的名字
- shortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME,shortCutName);
- //不允许重复添加
- shortCutIntent.putExtra("duplicate",false);
- //指定当前的Activity为快捷方式启动的对象
- shortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT,newIntent().setClass(context,cls));
- //添加快捷方式的图标
- ShortcutIconResourceiconRes=Intent.ShortcutIconResource.fromContext(context,resourceId);
- shortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,iconRes);
- context.sendBroadcast(shortCutIntent);
- }
- /**
- *删除桌面上的快捷方式,需要添加权限
- *<uses-permissionandroid:name="com.android.launcher.permission.UNINSTALL_SHORTCUT"/>
- *@paramcontext
- */
- publicstaticvoiddelShortcut(Contextcontext){
- Intentshortcut=newIntent(SHORTCUT_DEL_ACTION);
- //获取当前应用名称
- StringappName=null;
- try{
- appName=obtatinAppName(context);
- }catch(NameNotFoundExceptione){
- e.printStackTrace();
- }
- //快捷方式名称
- shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,appName);
- IntentshortcutIntent=context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
- shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT,shortcutIntent);
- context.sendBroadcast(shortcut);
- }
- /**
- *判断桌面上是否有快捷方式,调用此方法需要添加权限
- *<uses-permissionandroid:name="com.android.launcher.permission.READ_SETTINGS"/>
- *@paramcontext
- *@return
- *@throwsNameNotFoundException
- */
- publicstaticbooleanhasShortcut(Contextcontext){
- StringAUTHORITY=getAuthorityFromPermission(context,READ_SETTINGS_PERMISSION);
- if(AUTHORITY==null){
- returnfalse;
- }
- UriCONTENT_URI=Uri.parse("content://"+AUTHORITY+"/favorites?notify=true");
- StringappName=null;
- try{
- appName=obtatinAppName(context);
- }catch(NameNotFoundExceptione){
- e.printStackTrace();
- }
- Cursorc=context.getContentResolver().query(CONTENT_URI,newString[]{"title"},"title=?",newString[]{appName},null);
- if(c!=null&&c.getCount()>0){
- returntrue;
- }
- returnfalse;
- }
- /**
- *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下面
- *@paramcontext
- *@parampermission读取设置的权限READ_SETTINGS_PERMISSION
- *@return
- */
- privatestaticStringgetAuthorityFromPermission(Contextcontext,Stringpermission){
- if(TextUtils.isEmpty(permission)){
- returnnull;
- }
- List<PackageInfo>packs=context.getPackageManager().getInstalledPackages(PackageManager.GET_PROVIDERS);
- if(packs==null){
- returnnull;
- }
- for(PackageInfopack:packs){
- ProviderInfo[]providers=pack.providers;
- if(providers!=null){
- for(ProviderInfoprovider:providers){
- if(permission.equals(provider.readPermission)||permission.equals(provider.writePermission)){
- returnprovider.authority;
- }
- }
- }
- }
- returnnull;
- }
- /**
- *获取应用的名称
- *@paramcontext
- *@return
- *@throwsNameNotFoundException
- */
- privatestaticStringobtatinAppName(Contextcontext)throwsNameNotFoundException{
- PackageManagerpackageManager=context.getPackageManager();
- returnpackageManager.getApplicationLabel(packageManager.getApplicationInfo(context.getPackageName(),PackageManager.GET_META_DATA)).toString();
- }
- }
接下来我们来使用该工具类,我们在onCreate()的方法中先判断桌面上是否有该快捷方式,没有我们就创建一个快捷方式,然后提供一个删除快捷方式的按钮,代码还是比较简单,相信你很容易看懂的
- packagecom.example.shortcut;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- importandroid.util.Log;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- publicclassMainActivityextendsActivityimplementsOnClickListener{
- privatefinalstaticStringTAG="Activity";
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- 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);
- }
- //删除快捷方式的按钮
- ButtonmButton=(Button)findViewById(R.id.delete);
- mButton.setOnClickListener(this);
- }
- @Override
- publicvoidonClick(Viewv){
- switch(v.getId()){
- caseR.id.delete:
- ShortCutUtils.delShortcut(this);
- break;
- default:
- break;
- }
- }
- }
一、当我们进入MainActivity的时候,然后按HOME键进入后台,找到该桌面快捷方式点击,你会发现MainActivity的onCreate()被再一次的执行
二、你删掉我们添加的快捷方式,然后再应用主界面找到该应用图片,长按几秒钟,系统也会帮我们创建一个桌面快捷方式,你进入MainActivity,然后按HOME键,找到桌面快捷方式进入MainActivity,这时候你会发现,MainActivity的onCreate()方法没有被执行了显然第一种方式不是我们想要的,那怎么才能实现我们想要的第二种方式呢,别着急,我们只需要小小的修改一下,将上面的添加快捷方式Intent修改如下
- shortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT,newIntent()
- .setAction(Intent.ACTION_MAIN)
- .addCategory(Intent.CATEGORY_LAUNCHER)
- .setClass(context,cls));
设置好了,你在试一试,这时候你会发现,很应用列表长按的效果一样了,哈哈!
接下来我们来讨论下点击Notifycation的问题
我们点击一个按钮产生一个Notifycation,当我们点击Notifycation的时候,我们在onCreate()中调用如下方法来初始化Notifycation的有关东西
- /**
- *初始化Notifycation
- */
- privatevoidinitNotify(){
- nm=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
- n=newNotification();
- 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给你发来了一条消息,请查看!";
- Intentintent=newIntent().setClass(getApplication(),MainActivity.class);
- PendingIntentpi=PendingIntent.getActivity(this,0,intent,0);
- n.setLatestEventInfo(getApplication(),"我的微信","CSDN给你发来了一条消息,请查看!",pi);
- }
- /**
- *初始化Notifycation
- */
- privatevoidinitNotify(){
- nm=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
- n=newNotification();
- 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给你发来了一条消息,请查看!";
- Intentintent=newIntent()
- .setAction(Intent.ACTION_MAIN)
- .addCategory(Intent.CATEGORY_LAUNCHER)
- .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
- .setClass(getApplication(),MainActivity.class);
- PendingIntentpi=PendingIntent.getActivity(this,0,intent,0);
- n.setLatestEventInfo(getApplication(),"我的微信","CSDN给你发来了一条消息,请查看!",pi);
- }
问题就解决了,这个类似扣扣的效果,你点击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(); } }
上面的有些代码不太完整代码下载
相关推荐
1.点击桌面快捷方式进入到Task顶Activity 2.点击Notifycation进入到Task顶Activity 3.详情:http://blog.csdn.net/xiaanming/article/details/9312857
在android端,用webview加载html,里面包含一个按钮,点击html里的按钮跳转到android的另一个activity中
android:scheme 通过uri跳转到APP应用指定Activity
1.使用 Intent 和 Bundle 实现页面之间的参数传递和跳转; 2.ListView 的使用以及 ListView 中 Item 的点击事件处理 3.button点击事件
Android 中从activity1跳转到activity2再回到activity所经历的生命周期
假如说有一个activity A,在A中跳转到Activity B, 然后在B中跳转到Activity C中,最后要在C中把activity A,B,C都关掉。 首先有一个Activity A,A中有一个Button,点击这个Button会跳到Activity B中去,但会拿到...
安卓启动时快速跳转到指定activity
android实现activity跳转,给初学者一点实例参考,本源码就是实现点击按钮,实现activity跳转
android activity各种方式跳转 经典 完整代码 非常经典 非常好用完整的代码.
演示5.x之前Android的Activity跳转动画,以及Android5.x之后的跳转动画
android 自定义 dialog和activity 跳转的样式
Android源程序实现两个Activity之间的跳转
android activity之间的跳转
代码主要实现从一个Activity跳转到另外一个Activity
android activity跳转 窗口跳转
Android 单击实现页面跳转
cordova跳转原生Activity
Activity A跳转Activity B,再按返回键,A、B的生命周期执行顺序是什么? 当听到这个题目的时候,我得意地笑了笑,对于Activity的生命周期已经记熟的我,心想,为什么不直接问Activity的生命周期呢?于是想当然的说...
android开发简单的页面跳转特效,整理过的源码。很简单,你懂的
例子中可以从mainactivity跳转到next01activity、next02activity、next03activity、next04activity 也可以从next01activity、next02activity、next03activity、next04activity中跳转回到mainactivity