您的位置:首页 > 移动开发 > Android开发

android 多个shortCut快捷方式实现以及对58同城快捷方式的实现思路的研究

2015-03-31 17:26 483 查看
这几天,项目中有个新需求,需要按照模块添加不同的快捷方式到桌面上,从而方便用户的使用。特意进行了研究并分析了下58上面桌面快捷方式的实现。

首先多个shortcut的实现:

<activity
android:name="com.soyoungboy.android.demo.MainActivity"
android:configChanges="keyboardHidden|orientation"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 瀑布流 -->
<activity
android:name="com.soyoungboy.android.demo.pinterest.PinterestActivity"
android:icon="@drawable/sinkingview_charming"
android:launchMode="singleInstance"
android:process=":process.sub"
android:theme="@android:style/Theme.Light.NoTitleBar" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>


重点是这里:

android:icon="@drawable/sinkingview_charming"
android:launchMode="singleInstance" -->必须这么写
android:process=":process.sub"--->指定新的进程给对应的activity

<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>

也可指定android:icon来对应这个Activity对应的快捷方式图标。

如果有<category android:name="android.intent.category.LAUNCHER" /> ,那么快捷方式将在启动时创建,也可不设置这行,通过代码去实现。

ShortCutUtils.java

import java.util.List;

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;
import android.util.Log;

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" />
*
* <br>
* <b> 当应用内部需要多个快捷方式时 :</b><br>
* android:taskAffinity="" <br>
* action android:name="android.intent.action.MAIN"<br>
* android:launchMode="singleTask"
*
* @param context
* @param className
* @param resourceId 快捷方式的图标
* @param appName 快捷方式的名字
* @param extra
*/

public static void addShortCut(Context context, String className,
int resourceId, String appName, String extra) {
Intent shortCutIntent = new Intent(SHORTCUT_ADD_ACTION);

try {
if (appName == null) {
// 获取当前应用名称
appName = obtatinAppName(context);
}
} catch (NameNotFoundException e) {
Log.e("ShortCutUtils==>addShortCut",
"NameNotFoundException :" + e.toString());
}
// 添加快捷方式的名字
shortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, appName);
// 不允许重复添加
shortCutIntent.putExtra("duplicate", false);
if (className == null) {
className = context.getClass().getName();
}
// 在里面的intent添加参数
shortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT,
new Intent().setClassName(context.getPackageName(), className)
.putExtra("ShortCutExtra", extra));
// 添加快捷方式的图标
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
* @param className
* @param appName
*/
public static void delShortcut(Context context, String className,
String appName) {
Intent shortcut = new Intent(SHORTCUT_DEL_ACTION);
try {
if (appName == null) {
// 获取当前应用名称
appName = obtatinAppName(context);
}
} catch (NameNotFoundException e) {
Log.e("ShortCutUtils==>delShortcut",
"NameNotFoundException :" + e.toString());
}
// 快捷方式名称
shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, appName);
if (className == null) {
className = context.getClass().getName();
}
shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(
Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER)
.setClassName(context.getPackageName(), className));
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 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 (NameNotFoundException 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;
}

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


Activity中创建快捷方式:
这是Activity oncreate()里面的代码:

if (!ShortCutUtils.hasShortcut(getApplicationContext(), "瀑布流")) {
ShortCutUtils.addShortCut(getApplicationContext(),
"com.soyoungboy.android.demo.pinterest.PinterestActivity2",
R.drawable.sinkingview_charming, "瀑布流", "PinterestActivity2");
}


这样就会针对这个Activity创建快捷方式,如果点击启动我们设置在ShortCutIntent中对应的Activity的界面。从而实现多icon,多个执行入口的功能。

然后我们分析下58同城骚当的快捷方式,当然在没看到内部实现远离之前,我是这么认为的。

首先看下界面:



点击后:



后续就是进入对应模块界面了,我就不截图了。

然后反编译下代码,看下怎么实现的。

配置文件里面有如下内容:

<activity android:theme="@style/DialogActivity" android:name="com.wuba.plugins.ThirdFolderActivity" android:taskAffinity="com.wuba.affinity_third_folder" android:screenOrientation="portrait" android:configChanges="locale|keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>


然后分析LauchActivity的java文件:

<activity android:label="@string/app_name" android:name="com.wuba.activity.launch.LaunchActivity" android:screenOrientation="portrait" android:configChanges="locale|keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>


由上面看出是程序入口:
LauchActivity反编译后的代码片段:

package com.wuba.activity.launch;

import android.app.Activity;
import android.app.Dialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewStub;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.networkbench.agent.impl.NBSAppAgent;
import com.wuba.actionlog.ActionLogObservService;
import com.wuba.actionlog.OpenClientIntentService;
import com.wuba.activity.home.a.c.a;
import com.wuba.activity.recruit.RecruitCateActivity;
import com.wuba.activity.webactivity.CategoryListActivity;
import com.wuba.activity.webactivity.GroupBuyHomeActivity;
import com.wuba.android.lib.util.commons.f;
import com.wuba.android.lib.util.commons.h;
import com.wuba.android.lib.util.commons.j;
import com.wuba.android.lib.util.commons.k;
import com.wuba.android.lib.util.commons.m;
import com.wuba.application.WubaHybridApplication;
import com.wuba.f.a.a;
import com.wuba.f.a.g;
import com.wuba.f.a.i;
import com.wuba.f.a.l;
import com.wuba.fragment.InfoListFragmentActivity;
import com.wuba.frame.parse.beans.au;
import com.wuba.frame.parse.beans.au.a;
import com.wuba.home.HomeActivity;
import com.wuba.model.bw;
import com.wuba.plugins.weather.WeatherDetailActivity;
import com.wuba.utils.at;
import com.wuba.utils.bc;
import com.wuba.utils.bf;
import com.wuba.utils.r;
import com.wuba.views.bm;
import com.wuba.views.bm.a;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class LaunchActivity extends com.wuba.activity.a
{
public static boolean g;
private static final String h = h.a(LaunchActivity.class);
boolean b = false;
public ImageView c;
public TextView d;
public boolean e = true;
public boolean f;
private Thread i;
private Bitmap j;
private String k;
private Handler l = new a(this);
private Runnable m = new c(this);

static
{
g = false;
}

private void c()
{
if ((this.j != null) && (!this.j.isRecycled()))
{
this.j.recycle();
this.j = null;
}
}

private static String d(String paramString)
{
if ((!TextUtils.isEmpty(paramString)) && (paramString.startsWith("<font")))
try
{
Matcher localMatcher = Pattern.compile("size=\\d+").matcher(paramString);
if (localMatcher.find())
{
String str1 = localMatcher.group();
String str2 = str1.substring(1 + str1.indexOf("="));
return str2;
}
}
catch (Exception localException)
{
return "24";
}
return "24";
}

private void d()
{
String str1;
if (!this.b)
{
this.b = true;
if (bf.c(this) == 1)
{
str1 = bf.b(this);
if (!TextUtils.isEmpty(str1))
bf.n(this, "");
}
}
try
{
float f1 = bc.b(str1);
if (f1 < 4900.0F)
com.wuba.c.a.a(getContentResolver(), false);
if (f1 == 4700.0F)
{
SharedPreferences localSharedPreferences = getSharedPreferences("com.wuba_other_file", 0);
str2 = localSharedPreferences.getString("MD5PWD", "");
str3 = localSharedPreferences.getString("USERNAME", "");
str4 = localSharedPreferences.getString("USERID", "");
new StringBuilder("userName:").append(str3).append(",md5pwd:").append(str2);
localbw = bw.a(this);
}
}
catch (Exception localException1)
{
try
{
String str2;
String str3;
String str4;
bw localbw;
localbw.b = new f().b(new String(com.wuba.android.lib.util.commons.b.a("Mm1oc2ktMXNzM0A9c21AI3NqPTQ4KnNqdzAyamg=".toCharArray())), str2);
label180: localbw.c = str4;
localbw.a = str3;
localbw.d();
while (true)
{
this.i = new Thread(new com.wuba.j.c(this));
this.i.start();
bw.a(this).f();
return;
localException1 = localException1;
localException1.getMessage();
}
}
catch (Exception localException2)
{
break label180;
}
}
}

public final void a()
{
g = true;
Intent localIntent1 = getIntent();
Bundle localBundle = localIntent1.getExtras();
boolean bool;
String str7;
String str8;
String str9;
Intent localIntent6;
if (localBundle == null)
{
bool = false;
if (!bool)
break label245;
if (!bf.bb(this))
bf.bc(this);
String str6 = localBundle.getString("jump_protocol");
str7 = localBundle.getString("pre_key_third_folder_city_id");
str8 = localBundle.getString("pre_key_third_folder_city_dir");
str9 = localBundle.getString("pre_key_third_folder_city_name");
if (TextUtils.isEmpty(str6))
break label184;
localIntent6 = com.wuba.trade.api.b.c.b(this, str6);
if (localIntent6 != null)
break label148;
localIntent6 = new Intent();
localIntent6.setClass(this, HomeActivity.class);
label111: localIntent6.putExtra("third_folder_shortcut_intent", true);
startActivity(localIntent6);
finish();
}
label148: label184: label245: for (int n = 1; ; n = 0)
{
if (n == 0)
break label251;
return;
bool = at.b(localBundle);
break;
localIntent6.putExtra("pre_key_third_folder_city_id", str7);
localIntent6.putExtra("pre_key_third_folder_city_dir", str8);
localIntent6.putExtra("pre_key_third_folder_city_name", str9);
break label111;
String str10 = localBundle.getString("third_folder_class_name");
Intent localIntent5 = new Intent();
if (!TextUtils.isEmpty(str10))
localIntent5.setClassName(this, str10);
while (true)
{
startActivity(localIntent5);
finish();
break;
localIntent5.setClass(this, HomeActivity.class);
}
}
label251: String str1 = localIntent1.getStringExtra("random_num");
if ((localIntent1.getBooleanExtra("is_notify_distribute", false)) && (!bf.a(this, str1)))
{
startActivity((Intent)localIntent1.getParcelableExtra("intent"));
finish();
overridePendingTransition(a.a.slide_in_right, a.a.slide_out_right);
return;
}
if ((localBundle != null) && (at.c(localBundle)))
{
String str2 = localBundle.getString("shortcut_protocol");
if (!TextUtils.isEmpty(str2))
{
Intent localIntent4 = com.wuba.trade.api.b.c.b(this, str2);
localIntent4.addFlags(335544320);
startActivity(localIntent4);
finish();
overridePendingTransition(a.a.slide_in_right, a.a.slide_out_right);
return;
}
Intent localIntent3 = new Intent();
String str3 = localIntent1.getStringExtra("shortcut_intent_class");
String str4;
au localau;
if ("CategoryListActivity".equals(str3))
{
str3 = CategoryListActivity.class.getCanonicalName();
localIntent3.setClassName(this, str3);

str4 = localBundle.getString("shortcut_title");
if ((!localBundle.containsKey("intent_data_tag_string")) || (TextUtils.isEmpty(localBundle.getString("intent_data_tag_string"))))
break label630;
localau = at.a(localBundle);
if (localau != null)
break label551;
localIntent3.setClass(this, HomeActivity.class);
}
while (true)
{
finish();
overridePendingTransition(0, 0);
return;
if ("GroupBuyHomeActivity".equals(str3))
{
str3 = GroupBuyHomeActivity.class.getCanonicalName();
break;
}
if ("InfoListActivityGroup".equals(str3))
{
str3 = InfoListFragmentActivity.class.getCanonicalName();
break;
}
if (!"RecruitCateActivity".equals(str3))
break;
str3 = RecruitCateActivity.class.getCanonicalName();
break;
label551: localau.q = au.a.e;
if (!TextUtils.isEmpty(str4))
localau.e = str4;
String str5 = localBundle.getString("cate_id");
localIntent3.putExtra("list_name", localBundle.getString("list_name"));
localIntent3.putExtra("cate_id", str5);
localIntent3.putExtra("jump_bean", localau);
startActivity(localIntent3);
}
label630: if (WeatherDetailActivity.class.getCanonicalName().equals(str3))
{
localIntent3.setClass(this, WeatherDetailActivity.class);
localBundle.putBoolean("shortcut_intent", true);
}
while (true)
{
localIntent3.putExtras(localBundle);
startActivity(localIntent3);
break;
if (!RecruitCateActivity.class.getCanonicalName().equals(str3))
{
localIntent3.setClass(this, HomeActivity.class);
continue;
}
if (TextUtils.isEmpty(str4))
continue;
localBundle.putString("shortcut_title", str4);
}
}
Intent localIntent2 = new Intent();
if ((!j.b(getApplicationContext(), "has_used_app")) || (bf.L(this)))
{
j.b(getApplicationContext(), "has_used_app", true);
j.b(getApplicationContext(), "from_launch", true);
localIntent2.setClass(this, LeadingActivity.class);
}
while (true)
{
startActivity(localIntent2);
finish();
overridePendingTransition(0, 0);
return;
j.l(getApplicationContext(), "from_launch");
localIntent2.setClass(this, HomeActivity.class);
}
}

protected void onActivityResult(int paramInt1, int paramInt2, Intent paramIntent)
{
if (paramInt1 == 100)
d();
}

public void onBackPressed()
{
}

protected void onCreate(Bundle paramBundle)
{
String str1 = com.wuba.android.lib.util.commons.e.b + "/shared_prefs/com.wuba.xml";
String str2 = com.wuba.android.lib.util.commons.e.b + "/shared_prefs/com.wuba_new_v5.xml";
File localFile1 = new File(str1);
File localFile2 = new File(str2);
if ((localFile1.exists()) && (!localFile2.exists()));
while (true)
{
String str6;
String str7;
try
{
com.wuba.android.lib.util.c.b.a(localFile1, localFile2);
Iterator localIterator = com.wuba.databaseprovider.c.f(getContentResolver()).entrySet().iterator();
if (!localIterator.hasNext())
continue;
Map.Entry localEntry = (Map.Entry)localIterator.next();
str6 = (String)localEntry.getKey();
str7 = (String)localEntry.getValue();
if (!str6.equals("ISLOGIN"))
break label366;
if (!"true".equals(str7))
break label360;
bool2 = true;
j.b(this, str6, bool2);
new StringBuilder("Key=").append((String)localEntry.getKey()).append("---->value=").append((String)localEntry.getValue());
continue;
}
catch (IOException localIOException)
{
localIOException.getMessage();
bf.a(this, getSharedPreferences("wuba_main", 0).getString("versionName", ""));
}
super.onCreate(paramBundle);
if ((com.wuba.j.i.b(getApplicationContext()) != 1) && (!WubaHybridApplication.a))
break;
bm.a locala1 = new bm.a(this);
bm.a locala2 = locala1.a("提示");
locala2.a = "系统出了点小问题,请重新启动应用";
locala2.c = new e(this);
locala2.a("确定", new d(this));
bm localbm = locala1.a();
localbm.setCanceledOnTouchOutside(false);
localbm.show();
return;
label360: boolean bool2 = false;
continue;
label366: if (str6.equals("ISAUTOLOGIN"))
{
if (TextUtils.isEmpty(str7));
for (int n = 0; ; n = Integer.valueOf(str7).intValue())
{
j.b(this, str6, n);
break;
}
}
j.b(this, str6, str7);
}
NBSAppAgent.setLicenseKey("11b451575622485ea9a046de024fa83d").withCrashReportEnabled(false).withLocationServiceEnabled(true).start(this);
if ((getIntent() != null) && (getIntent().getBooleanExtra("launcht_activity_theme", false)))
setTheme(a.l.Theme_Launch_NORMAL);
while (true)
{
WubaHybridApplication localWubaHybridApplication = (WubaHybridApplication)getApplication();
String str3 = bf.a(localWubaHybridApplication);
label533: Intent localIntent3;
label633: String str4;
String str5;
if (com.wuba.android.lib.util.commons.e.c.equals(str3))
{
bf.e(localWubaHybridApplication, false);
new StringBuilder("WubaPersistentUtils.versionIsUpdate(this)=").append(bf.L(localWubaHybridApplication));
bf.a(localWubaHybridApplication, 0);
localWubaHybridApplication.a(false);
Context localContext = getApplicationContext();
String[] arrayOfString = new String[1];
arrayOfString[0] = bf.W(getApplicationContext());
com.wuba.utils.a.a(localContext, "main", "loading", arrayOfString);
new ActionLogObservService();
ActionLogObservService.a(this, 25);
localIntent3 = getIntent();
if (localIntent3.getBooleanExtra("shortcut_intent", false))
{
if (!localIntent3.getBooleanExtra("weather_shortcut_intent", false))
break label1122;
com.wuba.utils.a.a(this, "start", "desktopicon", new String[] { "weather" });
}
com.wuba.utils.a.a(this, "start", "connect", new String[0]);
if (!TextUtils.isEmpty(bf.q(this)))
bf.m(this, "");
bw.a(this);
((WubaHybridApplication)getApplication()).d();
setContentView(a.i.launch);
getFilesDir().getAbsolutePath();
str4 = getFilesDir() + File.separator + "loadingImg";
if (!new File(str4 + File.separator + "loading_img.jpg").exists())
break label1153;
str5 = str4 + File.separator + "loading_img.jpg";
label793: this.k = str5;
if (!TextUtils.isEmpty(this.k))
break label1231;
bf.g(this, "0", "0");
this.e = false;
((ViewStub)findViewById(a.g.launch_native_stub)).inflate();
label838: com.wuba.utils.q.e = true;
}
try
{
boolean bool1 = "mounted".equals(Environment.getExternalStorageState());
if (bool1);
while (true)
{
r.a(this);
if (!com.wuba.android.lib.util.d.i.e(this))
break label1288;
OpenClientIntentService.a(this, "launcher");
new c.a(com.wuba.activity.home.a.c.a(this), 0).start();
return;
setTheme(a.l.Theme_Launch);
break;
if (k.a(str3))
{
bf.a(localWubaHybridApplication, com.wuba.android.lib.util.commons.e.c);
bf.e(localWubaHybridApplication, true);
bf.a(localWubaHybridApplication, null, null, null);
bf.a(localWubaHybridApplication, 1);
bf.a(localWubaHybridApplication, false);
localWubaHybridApplication.a(true);
break label533;
}
if (!bc.a(str3, com.wuba.android.lib.util.commons.e.c))
break label533;
if (bc.a(str3))
{
Intent localIntent1 = new Intent("com.android.launcher.action.UNINSTALL_SHORTCUT");
Intent localIntent2 = new Intent();
localIntent2.setAction("android.intent.action.MAIN");
localIntent2.addCategory("android.intent.category.LAUNCHER");
localIntent2.setComponent(new ComponentName(localWubaHybridApplication.getApplicationContext().getPackageName(), "com.wuba.activity.main.LaunchActivity"));
localIntent1.putExtra("android.intent.extra.shortcut.INTENT", localIntent2);
localWubaHybridApplication.sendBroadcast(localIntent1);
bf.z(localWubaHybridApplication, "");
bf.a(localWubaHybridApplication, null, null, null);
}
bf.b(localWubaHybridApplication, str3);
bf.m(localWubaHybridApplication, str3);
bf.Q(localWubaHybridApplication);
bf.a(localWubaHybridApplication, com.wuba.android.lib.util.commons.e.c);
bf.e(localWubaHybridApplication, true);
bf.a(localWubaHybridApplication, false);
bf.a(localWubaHybridApplication, 1);
localWubaHybridApplication.a(true);
break label533;
label1122: com.wuba.utils.a.a(this, "start", "desktopicon", new String[] { localIntent3.getExtras().getString("list_name") });
break label633;
label1153: if (new File(str4 + File.separator + "loading_img.png").exists())
{
str5 = str4 + File.separator + "loading_img.png";
break label793;
}
str5 = null;
break label793;
label1231: this.e = true;
m.a().a(this.m);
break label838;
if (com.wuba.android.lib.util.c.b.a(getFilesDir()) > 500L)
continue;
Toast.makeText(this, "没有闪存或SD卡,可能看不到图片", 1).show();
}
}
catch (Exception localException)
{
while (true)
{
localException.getMessage();
continue;
label1288: OpenClientIntentService.a(this);
}
}
}
}

public void onDestroy()
{
c();
View localView = findViewById(a.g.launch_native_layout);
if ((localView != null) && (localView.getParent() != null))
{
localView.setBackgroundColor(-1);
ImageView localImageView = (ImageView)localView.findViewById(a.g.launch_native_logo);
if (localImageView != null)
localImageView.setImageBitmap(null);
((ViewGroup)localView.getParent()).removeView(localView);
}
super.onDestroy();
}

protected void onNewIntent(Intent paramIntent)
{
super.onNewIntent(paramIntent);
bf.a(this, paramIntent.getStringExtra("random_num"));
}

protected void onResume()
{
super.onResume();
d();
}
}


可以看出红色粗体的那块代码就是卸载当前快捷方式的代码;那么快捷方式在那里创建的呢?那么那个半透明的界面是怎么出来的呢?

不急不急:

通过检索看到b.java文件:

package com.wuba.thirdapps;

import android.content.Context;
import android.content.Intent;
import android.content.Intent.ShortcutIconResource;
import android.content.res.Resources;
import android.os.Build;
import android.os.Build.VERSION;
import com.wuba.android.lib.util.commons.e;
import com.wuba.application.WubaHybridApplication;
import com.wuba.f.a.f;
import com.wuba.f.a.k;
import com.wuba.g.az;
import com.wuba.model.bo;
import com.wuba.utils.at;
import com.wuba.utils.ax;
import com.wuba.utils.bf;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.message.BasicNameValuePair;

final class b
implements Runnable
{
b(ThirdAppApplication paramThirdAppApplication, Context paramContext)
{
}

public final void run()
{
try
{
com.wuba.a locala = ((WubaHybridApplication)(WubaHybridApplication)this.a.getApplicationContext()).c;
BasicNameValuePair[] arrayOfBasicNameValuePair = new BasicNameValuePair[4];
arrayOfBasicNameValuePair[0] = new BasicNameValuePair("ua", ax.d(Build.MANUFACTURER + "#" + Build.MODEL));
arrayOfBasicNameValuePair[1] = new BasicNameValuePair("ver", ax.d(Build.VERSION.RELEASE));
arrayOfBasicNameValuePair[2] = new BasicNameValuePair("sdkver", ax.d(Build.VERSION.SDK));
arrayOfBasicNameValuePair[3] = new BasicNameValuePair("channelid", e.d);
HttpGet localHttpGet = locala.b.a("http://platform.58.com/api/speedy", arrayOfBasicNameValuePair);
bo localbo = (bo)locala.b.a(localHttpGet, new az());
if ((localbo != null) && (localbo.a))
{
Context localContext = this.a;
String str = localContext.getResources().getString(a.k.app_third_folder_name);
if (!at.a(localContext.getApplicationContext(), str))
{
com.wuba.utils.a.a(localContext.getApplicationContext(), "main", "tools", new String[0]);
 Intent localIntent1 = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
localIntent1.putExtra("android.intent.extra.shortcut.NAME", str);
localIntent1.putExtra("duplicate", false);
Intent localIntent2 = new Intent();
localIntent2.setAction("android.intent.action.MAIN");
localIntent2.setClassName(localContext, "com.wuba.plugins.ThirdFolderActivity");
localIntent1.putExtra("android.intent.extra.shortcut.INTENT", localIntent2);
localIntent1.putExtra("android.intent.extra.shortcut.ICON_RESOURCE", Intent.ShortcutIconResource.fromContext(localContext, a.f.wb_app_third_icon));
localContext.sendBroadcast(localIntent1);
new Thread(new com.wuba.utils.d(localContext, str)).start();
}
}
bf.bc(this.a);
return;
}
catch (Exception localException)
{
}
}
}


创建快捷方式,点击快捷方式跳转到ThirdFolderActivity.java界面
由此可知快捷方式是ThirdFolderActivity界面创建的,并且确定点击快捷方式显示的Activity就是ThirdFolderActivity,通过wb_app_third_icon查看drawable下面的资源文件也确定这是58快捷方式的对应的界面。

那么就可知道58骚当入口的实现其实是这样子的:

1,ThirdFolderActivity界面就是点击快捷方式显示的那个半透明的显示7个模块图标的界面,当然跳转肯定是intent的拉。

2,界面半透明效果,style文件如下:

<style name="DialogActivity" parent="@android:style/Theme.Dialog">
<item name="android:windowBackground">@*android:color/transparent</item>
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowAnimationStyle">@*android:style/Animation.Dialog</item>
</style>


3,删除主应用的快捷方式,添加这个界面的快捷方式。

于是一个骚当的快捷方式实现了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: