android 多个Icon启动多个入口Activity

最近接了个任务,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

最终完美解决了。






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风堂主人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值