当前位置: 编程技术>移动开发
本页文章导读:
▪应用pm命令安装或卸载apk,静默安装、卸载方法 使用pm命令安装或卸载apk,静默安装、卸载方法
pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME][-s] [-f] PATH
pm uninstall [-k] PACKAGE
pm命令可以通过adb在shell中执行,同样,我们可以通过代码来执行。
/*
.........
▪ 挪动互联将告别广告模式,专注分成 移动互联将告别广告模式,专注分成
......
▪ NavigationDrawer+Fragment兑现侧滑菜单效果 NavigationDrawer+Fragment实现侧滑菜单效果学习了NavigationDrawer 官方Support包中的SlidingMenu版本,练了下手.用到了ListView中item不同的布局
以后会升级加上ViewPager和GridView实现多页面图片切换
代码:
pa.........
[1]应用pm命令安装或卸载apk,静默安装、卸载方法
来源: 互联网 发布时间: 2014-02-18
使用pm命令安装或卸载apk,静默安装、卸载方法
1 execCommand("pm","install","-f",filePath);//安装apk,filePath为apk文件路径,如/mnt/sdcard/ApiDemos.apk
pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME][-s] [-f] PATH
pm uninstall [-k] PACKAGE
pm命令可以通过adb在shell中执行,同样,我们可以通过代码来执行。
/* * m命令可以通过adb在shell中执行,同样,我们可以通过代码来执行 */ public static String execCommand(String ...command) { Process process=null; InputStream errIs=null; InputStream inIs=null; String result=""; try { process=new ProcessBuilder().command(command).start(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int read = -1; errIs=process.getErrorStream(); while((read=errIs.read())!=-1) { baos.write(read); } inIs=process.getInputStream(); while((read=inIs.read())!=-1) { baos.write(read); } result=new String(baos.toByteArray()); if(inIs!=null) inIs.close(); if(errIs!=null) errIs.close(); process.destroy(); } catch (IOException e) { result=e.getMessage(); } return result; }
1 execCommand("pm","install","-f",filePath);//安装apk,filePath为apk文件路径,如/mnt/sdcard/ApiDemos.apk
2
execCommand("pm","uninstall", packageName);//卸载apk,packageName为包名,如com.example.android.apis
编译生成apk时,要在你的manifest文件下添加android:sharedUserId="android.uid.system",如:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.xieyuan.mhfilemanager" android:versionCode="1" android:versionName="1.0" android:installLocation="internalOnly" android:sharedUserId="android.uid.system" >
编译完成之后还无法正常安装,会出现Installationerror:INSTALL_FAILED_SHARED_USER_INCOMPATIBLE错误,此时,要为apk重新签名。
在android源码\build\target\product\security中找platform.pk8和platform.x509.pem两个文件,在android编绎目录out下找到 signapk.jar这个包(源码目录\build\tools\signapk),并把编译好的apk(如PMDemo.apk)放在同一目录下,在重新签名之前,用rar文件打开apk文件,进入META-INF目录下,将CERT.SF和CERT.RSA这两个文件删除掉,然后在命令行中执行以下命令:
1
java -jar signapk.jarplatform.x509.pem platform.pk8 PMDemo.apk NewPMDemo.apk
安装前先把旧的apk卸载,这样重新签名之后的apk就可以正常安装了。
没有platform.pk8和platform.x509.pem,signapk.jar的可以到这里下载
[2] 挪动互联将告别广告模式,专注分成
来源: 互联网 发布时间: 2014-02-18
移动互联将告别广告模式,专注分成
昨天在虎嗅上看到一篇文章,指出移动互联网在盈利上应该走参与交易,获得分成的道路,有感而发,写出这篇文章,谈为什么我认为移动互联网应该告别广告盈利的模式。
我们先回头看一下传统互联网的存在方式及其盈利模式。
抛开特殊的电子商务和游戏,不难发现,传统互联网的盈利主要以广告为主。一个商业活动在互联网时代可以划分为三个组成部分:广告主(商家),中介平台(互联网服务提供者),网友(消费者)。这其实也是一个参与交易获得分成的模式,其中的额逻辑是什么呢?
我们以百度为例。你在百度上搜索你要的信息,比如开户。某家券商在百度上买了关键词,你看到了。于是你按照百度提供的信息去那里开了户,花费了100元。你是不是一位你在百度上搜索信息是免费的,其实不然,你花费的100元中可能有20元被券商给了百度,作为广告费。所以,百度带给你的便捷是收费的,这也是一种参与交易,获得分成的方式。
那么,在移动互联网时代是什么样子呢?我们仍然以百度为例。
你生病了,想去一家医院,于是用百度地图搜索,得到了线路图。这时你用百度地图内置的打车应用(假设百度地图有)打了一辆车,在车上顺便借助百度地图在医院附近租了一家如家,给一会来的家人休息用。你以为百度为你提供这一切没有收费,但你打的花费的30元、宾馆花费的200元、就医花费的500元中可能百度又抽取了一部分。
传统互联网模式是,商家在互联网上打广告,由于展示页面较大,广告可以打得起来,消费者受广告影响,参与消费。移动互联网的模式是,商家在移动互联网上上传信息(基于地理位置或者什么的),由于页面较小,不打广告,消费者受自己选择影响,参与就近消费。前者的消费者是基于搜索广泛寻求信息,必须接受广告,信息量大,不方便,最后参与交易的花费也小。后者的消费者基于本地,LBS,好友推荐,点评信息等寻求信息,不必接受广告,信息集中且准确度好,最后参与交易的花费较大。
所以,广告模式本身就是一个伪概念,不管传统互联网还是移动互联网盈利模式都是一样的:通过提供信息获取商家收益的分成。只是传统互联网是预付款(以广告的形式),而移动互联网是再结算(以分成的形式)。互联网产品及服务其实是个中介,获取的只是商家分给你的小部分收益,互联网公司要做的就是提供用户和商家之间的桥梁。PC时代你提供展示,移动互联时代你提供地理位置、点评、优惠劵、地图等等。相较于传统互联网,移动互联网的区别就是参与信息的碎片化,获得收入的碎片化,提供服务的碎片化,整个商业模式不再像原来那么单一,可能是多个商业交易的混合。所以,我说的移动互联网要告别广告盈利模式了,不能再用传统的广告思维经营移动互联网。
[3] NavigationDrawer+Fragment兑现侧滑菜单效果
来源: 互联网 发布时间: 2014-02-18
NavigationDrawer+Fragment实现侧滑菜单效果
activity_main.xml:
head_item.xml:
list_item.xml
page_fragment_layout.xml:
arrays.xml:
效果:
学习了NavigationDrawer 官方Support包中的SlidingMenu版本,练了下手.用到了ListView中item不同的布局
以后会升级加上ViewPager和GridView实现多页面图片切换
代码:
package com.light.study.android; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; import com.light.study.android.MyListAdapter.RowType; public class EventItem implements Item { private final String content; public EventItem(String content){ this.content = content; } @Override public int getViewType() { return RowType.LIST_ITEM.ordinal(); } @Override public View getView(LayoutInflater inflater, View convertView) { if(convertView==null){ convertView = inflater.inflate(R.layout.list_item, null); } TextView tv = (TextView) convertView.findViewById(R.id.list_content); tv.setText(content); return convertView; } @Override public boolean isClickable() { return true; } }
package com.light.study.android; import com.light.study.android.MyListAdapter.RowType; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; public class HeaderItem implements Item { private String name; public HeaderItem(String name){ this.name = name; } @Override public int getViewType() { return RowType.HEAD_ITEM.ordinal(); } @Override public View getView(LayoutInflater inflater, View convertView) { if(convertView==null){ convertView = inflater.inflate(R.layout.head_item, null); } TextView tv = (TextView) convertView.findViewById(R.id.headerText); tv.setText(name); return convertView; } @Override public boolean isClickable() { return false; } }
package com.light.study.android; import android.view.LayoutInflater; import android.view.View; public interface Item { public int getViewType(); public boolean isClickable(); public View getView(LayoutInflater inflater, View convertView); }
package com.light.study.android; import java.util.List; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; public class MyListAdapter extends ArrayAdapter<Item> { private Context mContext; private LayoutInflater inflater; private List<Item> list; public MyListAdapter(Context context, List<Item> list) { super(context, 0, list); this.mContext = context; this.inflater = LayoutInflater.from(mContext); this.list = list; } public enum RowType{ HEAD_ITEM,LIST_ITEM } @Override public boolean isEnabled(int position) { return this.list.get(position).isClickable(); } @Override public int getViewTypeCount() { return RowType.values().length; } @Override public int getItemViewType(int position) { return list.get(position).getViewType(); } @Override public View getView(int position, View convertView, ViewGroup parent) { return list.get(position).getView(inflater, convertView); } }
package com.light.study.android; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class PageFragment extends Fragment { public final static String ITEM_POSITION_NUMBER = "item_position_num"; public PageFragment(){} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View convertView = inflater.inflate(R.layout.page_fragment_layout, null); TextView tv = (TextView) convertView.findViewById(R.id.textView); int num = getArguments().getInt(ITEM_POSITION_NUMBER); //選擇對應的項目 String[] dynastyList = getResources().getStringArray(R.array.list_item); tv.setText(dynastyList[num]); return convertView; } }
package com.light.study.android; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.app.FragmentManager; import android.content.res.Configuration; import android.os.Bundle; import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.util.Log; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; public class MainActivity extends Activity { private DrawerLayout drawLayout; private ListView menuList; private ActionBarDrawerToggle toggle; private CharSequence mDrawerTitle; private String[] mMenuTitles; private String[] historyTitles; private String[] musicTitles; private String[] movieTitles; private String[] listTitles; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); initListener(); if (savedInstanceState == null) { selectItem(0); } } private void init() { mDrawerTitle = getTitle(); //历史栏 historyTitles = getResources().getStringArray(R.array.history); //音乐栏 musicTitles = getResources().getStringArray(R.array.music); //电影栏 movieTitles = getResources().getStringArray(R.array.movie); //标题数组 mMenuTitles = getResources().getStringArray(R.array.title); //每一項的標題 listTitles = getResources().getStringArray(R.array.list_item); drawLayout = (DrawerLayout) findViewById(R.id.drawer_layout); menuList = (ListView) findViewById(R.id.left_menu); //设置菜单阴影效果 drawLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); List<Item> list = new ArrayList<Item>(); //菜单加入历史标题和历史项 HeaderItem historyHeader = new HeaderItem(mMenuTitles[0]); list.add(historyHeader); for(int i =0;i<historyTitles.length;i++){ EventItem historyitem = new EventItem(historyTitles[i]); list.add(historyitem); } //菜单加入音乐标题和音乐项 HeaderItem musicHeader = new HeaderItem(mMenuTitles[1]); list.add(musicHeader); for(int i =0;i<musicTitles.length;i++){ EventItem musicItem = new EventItem(musicTitles[i]); list.add(musicItem); } //菜单加入电影标题和电影项 HeaderItem movieHeader = new HeaderItem(mMenuTitles[2]); list.add(movieHeader); for(int i =0;i<movieTitles.length;i++){ EventItem movieItem = new EventItem(movieTitles[i]); list.add(movieItem); } MyListAdapter adapter = new MyListAdapter(this, list); menuList.setAdapter(adapter); // enable ActionBar app icon to behave as action to toggle nav drawer getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setHomeButtonEnabled(true); toggle = new ActionBarDrawerToggle(this, drawLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close){ public void onDrawerClosed(View view) { invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } public void onDrawerOpened(View drawerView) { getActionBar().setTitle(mDrawerTitle); invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } }; drawLayout.setDrawerListener(toggle); } private void initListener() { //菜单单击事件监听器 menuList.setOnItemClickListener(new DrawerItemClickListener()); } /* The click listner for ListView in the navigation drawer */ private class DrawerItemClickListener implements ListView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Log.i("Light", "position:"+position); selectItem(position); } } private void selectItem(int position) { // update the main content by replacing fragments PageFragment fragment = new PageFragment(); //将当前选择的项传递到Fragment Bundle args = new Bundle(); args.putInt(PageFragment.ITEM_POSITION_NUMBER, position); fragment.setArguments(args); FragmentManager fragmentManager = getFragmentManager(); fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit(); drawLayout.closeDrawer(menuList); // update selected item and title, then close the drawer menuList.setItemChecked(position, true); //注意这里改变的是ActionBar的标题 getActionBar().setTitle(listTitles[position]); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); toggle.syncState(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // Pass any configuration change to the drawer toggls toggle.onConfigurationChanged(newConfig); } @Override public boolean onOptionsItemSelected(MenuItem item) { // The action bar home/up action should open or close the drawer. // ActionBarDrawerToggle will take care of this. if (toggle.onOptionsItemSelected(item)) { return true; } return super.onOptionsItemSelected(item); } }
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- The main content view--> <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" /> <!-- The navigation drawer --> <ListView android:id="@+id/left_menu" android:layout_height="match_parent" android:layout_width="240dp" android:layout_gravity="start" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" android:background="#111"/> </android.support.v4.widget.DrawerLayout>
head_item.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/headerText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#757678" android:paddingBottom="3dp" android:paddingTop="3dp" android:textColor="#f5c227" android:clickable="false" /> </LinearLayout>
list_item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/list_content" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_margin="5dip" android:gravity="center" android:linksClickable="false" android:longClickable="false" android:paddingBottom="1dip" android:paddingTop="1dip" android:textColor="#6d6d6d" android:textSize="17sp" /> </LinearLayout>
page_fragment_layout.xml:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> </FrameLayout>
arrays.xml:
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="history"> <item >三国</item> <item >楚汉</item> <item >春秋</item> <item >战国</item> </string-array> <string-array name="music"> <item >爵士</item> <item >古典</item> <item >现代</item> <item >民谣</item> </string-array> <string-array name="movie"> <item >悬疑</item> <item >爱情</item> <item >历史</item> <item >恐怖</item> </string-array> <string-array name="title"> <item >历史</item> <item >音樂</item> <item >电影</item> </string-array> <string-array name="list_item"> <item >歷史</item> <item >三国</item> <item >楚汉</item> <item >春秋</item> <item >战国</item> <item >音樂</item> <item >爵士</item> <item >古典</item> <item >现代</item> <item >民谣</item> <item >電影</item> <item >悬疑</item> <item >爱情</item> <item >历史</item> <item >恐怖</item> </string-array> </resources>
效果:
最新技术文章: