当前位置:  编程技术>移动开发
本页文章导读:
    ▪应用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,静默安装、卸载方法

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的可以到这里下载

http://download.csdn.net/detail/ab6326795/6042755

    
[2] 挪动互联将告别广告模式,专注分成
    来源: 互联网  发布时间: 2014-02-18
移动互联将告别广告模式,专注分成
昨天在虎嗅上看到一篇文章,指出移动互联网在盈利上应该走参与交易,获得分成的道路,有感而发,写出这篇文章,谈为什么我认为移动互联网应该告别广告盈利的模式。

我们先回头看一下传统互联网的存在方式及其盈利模式。

抛开特殊的电子商务和游戏,不难发现,传统互联网的盈利主要以广告为主。一个商业活动在互联网时代可以划分为三个组成部分:广告主(商家),中介平台(互联网服务提供者),网友(消费者)。这其实也是一个参与交易获得分成的模式,其中的额逻辑是什么呢?

我们以百度为例。你在百度上搜索你要的信息,比如开户。某家券商在百度上买了关键词,你看到了。于是你按照百度提供的信息去那里开了户,花费了100元。你是不是一位你在百度上搜索信息是免费的,其实不然,你花费的100元中可能有20元被券商给了百度,作为广告费。所以,百度带给你的便捷是收费的,这也是一种参与交易,获得分成的方式。

那么,在移动互联网时代是什么样子呢?我们仍然以百度为例。

你生病了,想去一家医院,于是用百度地图搜索,得到了线路图。这时你用百度地图内置的打车应用(假设百度地图有)打了一辆车,在车上顺便借助百度地图在医院附近租了一家如家,给一会来的家人休息用。你以为百度为你提供这一切没有收费,但你打的花费的30元、宾馆花费的200元、就医花费的500元中可能百度又抽取了一部分。

传统互联网模式是,商家在互联网上打广告,由于展示页面较大,广告可以打得起来,消费者受广告影响,参与消费。移动互联网的模式是,商家在移动互联网上上传信息(基于地理位置或者什么的),由于页面较小,不打广告,消费者受自己选择影响,参与就近消费。前者的消费者是基于搜索广泛寻求信息,必须接受广告,信息量大,不方便,最后参与交易的花费也小。后者的消费者基于本地,LBS,好友推荐,点评信息等寻求信息,不必接受广告,信息集中且准确度好,最后参与交易的花费较大。

所以,广告模式本身就是一个伪概念,不管传统互联网还是移动互联网盈利模式都是一样的:通过提供信息获取商家收益的分成。只是传统互联网是预付款(以广告的形式),而移动互联网是再结算(以分成的形式)。互联网产品及服务其实是个中介,获取的只是商家分给你的小部分收益,互联网公司要做的就是提供用户和商家之间的桥梁。PC时代你提供展示,移动互联时代你提供地理位置、点评、优惠劵、地图等等。相较于传统互联网,移动互联网的区别就是参与信息的碎片化,获得收入的碎片化,提供服务的碎片化,整个商业模式不再像原来那么单一,可能是多个商业交易的混合。所以,我说的移动互联网要告别广告盈利模式了,不能再用传统的广告思维经营移动互联网。

    
[3] NavigationDrawer+Fragment兑现侧滑菜单效果
    来源: 互联网  发布时间: 2014-02-18
NavigationDrawer+Fragment实现侧滑菜单效果

学习了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>

效果:




    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3