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配置
2.推广界面代码:
上效果:桌面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配置如下
感谢博主:http://blog.csdn.net/jdsjlzx/article/details/22077371
最终完美解决了。
在桌面另外创建一个伪文件夹,里面放我们自己的游戏快捷,点击某个快捷时:
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
最终完美解决了。
相关文章推荐
- android AsyncTask介绍
- android 高德地图出现【定位失败key鉴权失败】
- Android传感器的运用之ACCELEROMETER
- 3.Android-传感器开发-处理各种传感器配置
- 浏览器网页判断手机是否安装IOS/Android客户端程序
- Android-自定义AttributeSet属性
- 关于Android软键盘弹出,会把原来的界面挤上去的问题
- 【Android个人理解(八)】跨应用调用不同组件的方法
- 【Android笔记】EditText密码框中字体和普通输入框不同
- Android DrawerLayout 抽屉
- Android PopupWindows
- Android中自定义checkbox样式
- Android fill_parent、wrap_content和match_parent的区别
- 兼容 Android 4.4 透明状态栏与导航栏
- Android自定义组合标题控件
- Android——SlidingMenu学习总结
- Android ViewPager+Fragment 仿 Google Play 带箭头的导航栏
- Android学习笔记(五)基于监听的事件模式和基于回调的事件模式
- android中getSystemService详解
- android Singleton