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

android 多个Icon启动多个入口Activity

2015-06-03 16:37 681 查看
最近接了个任务,boss的想法是,模仿豌豆荚,金山助手之类的应用,在安装我们的应用时,

在桌面另外创建一个伪文件夹,里面放我们自己的游戏快捷,点击某个快捷时:

1.如果下载并安装了该应用,就直接启动该应用

2.如果没下载,则从服务器下载。

用来作为我们游戏推广的一个入口。

豌豆荚的效果:

,红色框住的是他的伪文件夹,

和左边的系统默认的文件夹效果(不同手机系统的文件夹图标是不一样的)还是有区别的,打开效果如下:


系统默认的文件夹,打开效果:


最开始的想法是从Luncher入手,创建文件夹,和快捷方式,发现非常麻烦。

后面无意中发现了android多入口。

感谢一下博主:
http://www.cnblogs.com/chen111/archive/2012/07/13/2590021.html http://blog.csdn.net/wxlinwzl/article/details/18908955
利用多入口,我的思路如下:

1.创建两个入口,入口1启动游戏,入口2启动推广界面(做一个伪对话框的界面)。

2.入口2界面中放一个列表,从服务器获取需要推广的应用显示(应用相关的信息一并获取,封装一个对象),

点击某一项的时候先获取该项对应的包名,查找手机应用安装列表中是否存在?

1>存在就直接通过包名启动.

2>获取对应apk的文件名,判断文件是否存在,并且文件大小是否和服务器给定的一致。是:调用安装,否:先下载,再安装

上配置代码段:

1.Mainifest配置

<application
android:name="com.i3game.qmxddz.ui.application.CrashApplication"
android:allowBackup="true"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.i3game.qmxddz.ui.activity.StartActivity1"
android:configChanges="orientation|keyboardHidden"
android:icon="@drawable/logo"
android:process=":process.main"
android:label="@string/app_name"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.i3game.qmxddz.ui.activity.WidgetActivity"
android:configChanges="orientation|keyboardHidden"
android:icon="@drawable/logo_2"
android:label="@string/app_name2"
android:process=":process.sub"
android:launchMode ="singleInstance"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>


2.推广界面代码:

package com.i3game.qmxddz.ui.activity;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.i3game.qmxddz.R;
import com.i3game.qmxddz.common.Database;
import com.i3game.qmxddz.common.HttpURL;
import com.i3game.qmxddz.update.DownLoadService;
import com.i3game.qmxddz.utils.HttpUtil;
import com.i3game.qmxddz.utils.ImageUtil;
import com.i3game.qmxddz.utils.ImageUtil.ImageCallback;
import com.i3game.qmxddz.utils.MultiScreenTool;
import com.i3game.qmxddz.vo.MyLog;
import com.i3game.qmxddz.vo.WidgetIcons;

public class WidgetActivity extends Activity implements OnClickListener {
private static String TAG = "WidgetActivity";
private static final int APK_INFO_GET_OK=101010;
private GridView gview;
private List<WidgetIcons> icon_list;
private IconAdapter sim_adapter;
private Handler mHandler;
protected MultiScreenTool mst = null;
public static final int ANDROID_BUILD_GINGERBREAD = 9;
public static final int SCREEN_ORIENTATION_SENSOR_LANDSCAPE = 6;
private RelativeLayout rootLl;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_widget);
Database.currentActivity=this;
// 判断横屏竖屏,初始化多屏幕适应工具
if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
mst = MultiScreenTool.singleTonHolizontal();
} else {
mst = MultiScreenTool.singleTonVertical();
}
mst.checkWidthAndHeight();
rootLl = (RelativeLayout) findViewById(R.id.aw_root_ll);
rootLl.setOnClickListener(this);
gview = (GridView) findViewById(R.id.aw_gview);
mst.adjustView(rootLl);
//获取数据
getData();
sim_adapter = new IconAdapter(this);

mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case APK_INFO_GET_OK:
//配置适配器
gview.setAdapter(sim_adapter);
sim_adapter.notifyDataSetChanged();
break;
default:
break;
}
}
};
}

@Override
public void onResume() {
super.onResume();
}

@Override
protected void onDestroy() {
super.onDestroy();
if (null != mst && null != rootLl) {
mst.unRegisterView(rootLl);
}
}

@Override
public void onClick(View arg0) {
switch (arg0.getId()) {
case R.id.aw_root_ll:
this.finish();
Database.currentActivity = null;
break;
default:
break;
}
}

/**
* 检测应用状态,并执行对应操作
* @param packgeName
*/
private void checkPackeg(WidgetIcons mWidgetIcons) {
String packgeName = mWidgetIcons.getPackgeName();
String downName = mWidgetIcons.getDownName();
String luncherName = mWidgetIcons.getLuncherActivity();
MyLog.d(TAG, "packgeName:" + packgeName + ",luncherName:" + luncherName + ",downName:" + downName );
if (isAvilible(this, packgeName)) {
MyLog.d(TAG, "已经安装-启动游戏");
Intent intent = new Intent();
ComponentName cn = new ComponentName(packgeName, luncherName);
intent.setComponent(cn);
startActivity(intent);
} else {
MyLog.d(TAG, "未安装-下载安装");
Database.UPDATED_STYLE = true;
Intent newIntent = new Intent(this, DownLoadService.class);
newIntent.putExtra("apkUrl", HttpURL.APK_DOWNLOAD_URL + downName);
newIntent.putExtra("apkName", downName+".apk");
stopService(newIntent);
startService(newIntent);
Toast.makeText(this, "正在下载-"+mWidgetIcons.getIconName(), 3000).show();
}
this.finish();
}

class IconAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private Context context;

public IconAdapter(Context context) {
this.context = context;
this.mInflater = LayoutInflater.from(context);
}

@Override
public int getCount() {
return icon_list == null ? 0 : icon_list.size();
}

@Override
public Object getItem(int arg0) {
return icon_list.get(arg0);
}

@Override
public long getItemId(int arg0) {
return arg0;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.widget_g_item, null);
holder = new ViewHolder();
holder.iconIv = (ImageView) convertView.findViewById(R.id.wgi_image);
holder.nameTv = (TextView) convertView.findViewById(R.id.wgi_text);
convertView.setTag(holder);
//				holder.iconIv.setImageResource(R.drawable.ic_launcher);
} else {
holder = (ViewHolder) convertView.getTag();
}
WidgetIcons mWidgetIcons = icon_list.get(position);

//图片ICON

MyLog.d(TAG, "position:"+position+",iconUrl:" + mWidgetIcons.getIconUrl());
ImageUtil.setImg(mWidgetIcons.getIconUrl(), holder.iconIv, new ImageCallback() {
public void imageLoaded(Bitmap bitmap, View view) {
((ImageView) view).setScaleType(ScaleType.FIT_XY);
((ImageView) view).setImageBitmap(bitmap);
}
});
holder.nameTv.setText(mWidgetIcons.getIconName());
holder.iconIv.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
WidgetIcons mWidgetIcons = icon_list.get(position);
String packgeName = mWidgetIcons.getPackgeName();
if (!"".equals(packgeName)) {
checkPackeg(mWidgetIcons);
}
}
});
return convertView;
}

class ViewHolder {
ImageView iconIv;//图片
TextView nameTv;//名称
}
}

/**
* 获取数据
* @return
*/
public List<WidgetIcons> getData() {
icon_list=new ArrayList<WidgetIcons>();
//
new Thread() {
public void run() {
icon_list = HttpUtil.getAPKInfo();
mHandler.sendEmptyMessage(APK_INFO_GET_OK);
};
}.start();
return icon_list;
}

/**
* 应用是否已安装
* @param context
* @param packageName
* @return
*/
private boolean isAvilible(Context context, String packageName) {
final PackageManager packageManager = context.getPackageManager();//获取packagemanager
List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);//获取所有已安装程序的包信息
List<String> pName = new ArrayList<String>();//用于存储所有已安装程序的包名
//从pinfo中将包名字逐一取出,压入pName list中
if (pinfo != null) {
for (int i = 0; i < pinfo.size(); i++) {
String pn = pinfo.get(i).packageName;
MyLog.d(TAG, "包名:" + pinfo.get(i).packageName);
pName.add(pn);
}
}
MyLog.d(TAG, "pName.contains(" + packageName + "):" + pName.contains(packageName));
return pName.contains(packageName);//判断pName中是否有目标程序的包名,有TRUE,没有FALSE
}
}


上效果:桌面icon,及启动进入的入口界面

入口1:com.i3game.qmxddz.ui.activity.StartActivity1

icon:

界面:



入口2:com.i3game.qmxddz.ui.activity.WidgetActivity

icon:

界面:


android里面可以在Manifest中配置多个入口activity,参数android:process="",可以为每个入口指定在不同的进程中运行,就像在运行不同的应用一样。

注意:为Activity指定process属性后,还必须为其指定launchMode为singleInstance,这样才有效,否则当你最先启动A入口,按home键回到桌面,再点B快捷,还是跳到A入口的界面。

到此,多入口基本实现,但是还有以下问题:

1.导致在手机设置-->管理应用界面里面的应用icon变android成默认的机器人了。


2.并没有桌面icon快捷,而是在应用列表中有那个推广的伪文件夹icon(一般常识在应用列表里面是不可能有文件夹的,只有在桌面才有)。

用户如果删除应用列表里的那个推广icon就会删除我们的应用。

解决办法:

1.将android:icon="@drawable/logo"

android:label="@string/app_name"的设置全部放到application标签中去

2.在入口1的启动Activity中,用代码创建入口2的桌面快捷,并制定启动入口2

这样解决了,上面第一个问题,第二个问题并没有彻底解决,并且还出现了个新问题。

在应用列表中出现了两个同样名称和图标的icon(应为在aplication指定的)用户删除桌面快捷是不会删除应用,但是应用列表中两个入口随便哪个icon还是会删掉应用。

现在只有一个问题:如何去掉入口2在应用列表中的显示(也就是说入口2只显示桌面快捷,

这样用户即使删除桌面快捷不会删掉我们的应用。却又可以通过桌面快捷进入入口2,推广我们的游戏。)

在网上找了下,最终找到答案,在入口activity里面<intent-filter>中设置<data android:host="AuthActivity" android:scheme="com.android.example" />

最终的Mainifest配置如下

<application
android:name="com.i3game.qmxddz.ui.application.CrashApplication"
android:allowBackup="true"
android:debuggable="true"
android:icon="@drawable/logo"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.i3game.qmxddz.ui.activity.StartActivity1"
android:configChanges="orientation|keyboardHidden"
android:process=":process.main"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.i3game.qmxddz.ui.activity.WidgetActivity"
android:configChanges="orientation|keyboardHidden"
android:process=":process.sub"
android:screenOrientation="portrait"
android:launchMode ="singleInstance"
android:theme="@android:style/Theme.Translucent.NoTitleBar" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<data android:host="AuthActivity" android:scheme="com.android.example" />
</intent-filter>
</activity>


感谢博主:http://blog.csdn.net/jdsjlzx/article/details/22077371

最终完美解决了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: