当前位置: 编程技术>移动开发
本页文章导读:
▪什么是九.png 什么是9.png
<table border="0" cellspacing="0" cellpadding="0"><tbody><tr><td id="postmessage_162697" >什么是9.png:<br> 可能做过任务栏美化的同学都会知道,我靠,framework-res.........
▪ StartService 跟 bindService StartService 和 bindService
Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDestroy我们有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。1 通过startService Service会经.........
▪ 获取sdcard上的全部apk 获取sdcard上的所有apk
package com.shishixun.installapk;import java.io.file;<br>import java.io.filefilter;<br>import java.util.arraylist;import android.app.activity;<br>import android.content.pm.packageinfo;<br>.........
[1]什么是九.png
来源: 互联网 发布时间: 2014-02-18
什么是9.png
<table border="0" cellspacing="0" cellpadding="0"><tbody><tr><td id="postmessage_162697" >什么是9.png:<br> 可能做过任务栏美化的同学都会知道,我靠,framework-res.apk\res\drawable-hdpi 目录下有非常非常多的xxxxxx.9.png图片。<br>千万不要以为这个9只是png格式图片的命名区分,其实他是一种特殊的格式,在png图片的基础上动了些手脚,而且这种手脚你会<br>看不见摸不着(详情见下面具体内容)。<br> 9.png格式的图片是安卓平台上新创的一种被拉伸却不失真的玩意(挺高级的吧),也许有<br>的同学在做美化的时候很喜欢一个图片素材,重命名替换了drawable-hdpi下的素材,但是运行系统后发现,怎么被拉伸得不像样子<br>了,哈哈,这就是9.png图片不能轻易碰的神奇所在,不过不要紧,下面看完你就会了,安卓美化大师就是你了。<br> 首先我们还是得介绍一下,9.png图片他的具体不同之处,它的四周与普通的png图片相比多了一个像素位的白色区域,该区域<br>只有在图片被还原和制造的时候才能看到,当打包后无法看见,并且图片的总像素会缩小2个像素,比如23x23像素的9.png图片被<br>打包后会变成21x21像素。所以我们在制作的时候要注意掌握尺寸。<br> 当我们制作出9.png图片的时候你还有惊奇的发现一个几kb或者几十kb的图片,变得非常的小,一般只有几百个字节那么大,<br>系统加载起来当然会更加的流畅咯。</td></tr></tbody></table><div>android tools下面有一个draw9patch.bat ,可以将一个png图片变成一个由9个补丁(patch)组成的png。并命名为9.png
<table border="0" cellspacing="0" cellpadding="0"><tbody><tr><td id="postmessage_162697" >什么是9.png:<br> 可能做过任务栏美化的同学都会知道,我靠,framework-res.apk\res\drawable-hdpi 目录下有非常非常多的xxxxxx.9.png图片。<br>千万不要以为这个9只是png格式图片的命名区分,其实他是一种特殊的格式,在png图片的基础上动了些手脚,而且这种手脚你会<br>看不见摸不着(详情见下面具体内容)。<br> 9.png格式的图片是安卓平台上新创的一种被拉伸却不失真的玩意(挺高级的吧),也许有<br>的同学在做美化的时候很喜欢一个图片素材,重命名替换了drawable-hdpi下的素材,但是运行系统后发现,怎么被拉伸得不像样子<br>了,哈哈,这就是9.png图片不能轻易碰的神奇所在,不过不要紧,下面看完你就会了,安卓美化大师就是你了。<br> 首先我们还是得介绍一下,9.png图片他的具体不同之处,它的四周与普通的png图片相比多了一个像素位的白色区域,该区域<br>只有在图片被还原和制造的时候才能看到,当打包后无法看见,并且图片的总像素会缩小2个像素,比如23x23像素的9.png图片被<br>打包后会变成21x21像素。所以我们在制作的时候要注意掌握尺寸。<br> 当我们制作出9.png图片的时候你还有惊奇的发现一个几kb或者几十kb的图片,变得非常的小,一般只有几百个字节那么大,<br>系统加载起来当然会更加的流畅咯。</td></tr></tbody></table><div>android tools下面有一个draw9patch.bat ,可以将一个png图片变成一个由9个补丁(patch)组成的png。并命名为9.png
[2] StartService 跟 bindService
来源: 互联网 发布时间: 2014-02-18
StartService 和 bindService
Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDestroy
我们有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。
1 通过startService
Service会经历 onCreate --> onStart
stopService的时候直接onDestroy
如果是 调用者 直接退出而没有调用stopService的话,Service会一直在后台运行。
下次调用者再起来仍然可以stopService。
2 通过bindService
Service只会运行onCreate, 这个时候 调用者和Service绑定在一起
调用者退出了,Srevice就会调用onUnbind-->onDestroyed
所谓绑定在一起就共存亡了。
注意:Service的onCreate的方法只会被调用一次,
就是你无论多少次的startService又 bindService,Service只被创建一次。
如果先是bind了,那么start的时候就直接运行Service的onStart方法,
如果先是start,那么bind的时候就直接运行onBind方法。如果你先bind上了,就stop不掉了,
只能先UnbindService, 再StopService,所以是先start还是先bind行为是有区别的。
Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。
服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。
这两个方法都可以启动Service,但是它们的使用场合有所不同。使用startService()方法启用服务,调用者与服务之间没有关连,
即使调用者退出了,服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。
如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,
接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,
但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。
如果打算采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,
接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,
接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,
多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。
如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法.
Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDestroy
我们有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。
1 通过startService
Service会经历 onCreate --> onStart
stopService的时候直接onDestroy
如果是 调用者 直接退出而没有调用stopService的话,Service会一直在后台运行。
下次调用者再起来仍然可以stopService。
2 通过bindService
Service只会运行onCreate, 这个时候 调用者和Service绑定在一起
调用者退出了,Srevice就会调用onUnbind-->onDestroyed
所谓绑定在一起就共存亡了。
注意:Service的onCreate的方法只会被调用一次,
就是你无论多少次的startService又 bindService,Service只被创建一次。
如果先是bind了,那么start的时候就直接运行Service的onStart方法,
如果先是start,那么bind的时候就直接运行onBind方法。如果你先bind上了,就stop不掉了,
只能先UnbindService, 再StopService,所以是先start还是先bind行为是有区别的。
Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。
服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。
这两个方法都可以启动Service,但是它们的使用场合有所不同。使用startService()方法启用服务,调用者与服务之间没有关连,
即使调用者退出了,服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。
如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,
接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,
但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。
如果打算采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,
接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,
接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,
多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。
如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法.
[3] 获取sdcard上的全部apk
来源: 互联网 发布时间: 2014-02-18
获取sdcard上的所有apk
package com.shishixun.installapk;
import java.io.file;<br>import java.io.filefilter;<br>import java.util.arraylist;
import android.app.activity;<br>import android.content.pm.packageinfo;<br>import android.content.pm.packagemanager;<br>import android.graphics.drawable.drawable;<br>import android.os.bundle;<br>import android.text.format.formatter;<br>import android.util.log;
public class mainactivity extends activity {<br> /** called when the activity is first created. */<br> @override<br> public void oncreate(bundle savedinstancestate) {<br> super.oncreate(savedinstancestate);<br> setcontentview(r.layout.main);<br> final file appfolder = new file( "/sdcard" );<br> arraylist<file> files = getfiles( appfolder,<br> true );<br> packagemanager pm = getpackagemanager( );<br> for ( int i = 0, size = files.size( ); i < size; i++ )<br> {<br> file f = files.get( i );<br> packageinfo pi= pm.getpackagearchiveinfo( f.getabsolutepath( ), 0 );<br> if ( pi != null )<br> {<br> apkinfo holder = new apkinfo( );<br> holder.file = f;<br> holder.pkgname = pi.packagename;<br> holder.size = f.length( );<br> holder.sizestring = formatter.formatfilesize( mainactivity.this,<br> holder.size );<br> holder.version = pi.versionname == null ? string.valueof( pi.versioncode )<br> : pi.versionname;<br> system.out.println("file="+f+"pkgname="+holder.pkgname +"size"+holder.sizestring+"version"+holder.version );<br> }<br> }
}<br> <br> <br> arraylist<file> getfiles( file parent, final boolean recursive )<br> {<br> final arraylist<file> files = new arraylist<file>( );
filefilter filter = new filefilter( ) {
public boolean accept( file f )<br> {<br> if ( f.isfile( )<br> && f.getname( ).tolowercase( ).endswith( ".apk" ) )
{<br> files.add( f );<br> }<br> else if ( recursive && f.isdirectory( ) )<br> {<br> try<br> {<br> // try skip links<br> if ( f.getabsolutepath( )<br> .equals( f.getcanonicalpath( ) ) )<br> {<br> f.listfiles( this );<br> }<br> }<br> catch ( exception e )<br> {<br> log.e( mainactivity.class.getname( ),<br> e.getlocalizedmessage( ),<br> e );<br> }<br> }<br> return false;<br> }<br> };
parent.listfiles( filter );
return files;<br> }<br> <br> <br> /**<br> * apkinfo<br> */<br> private static final class apkinfo<br> {
file file;<br> charsequence label;<br> string pkgname;<br> string version;<br> string sizestring;<br> long size;<br> drawable icon;<br> int installed;<br> boolean checked;
apkinfo( )<br> {
}<br> }<br>}
package com.shishixun.installapk;
import java.io.file;<br>import java.io.filefilter;<br>import java.util.arraylist;
import android.app.activity;<br>import android.content.pm.packageinfo;<br>import android.content.pm.packagemanager;<br>import android.graphics.drawable.drawable;<br>import android.os.bundle;<br>import android.text.format.formatter;<br>import android.util.log;
public class mainactivity extends activity {<br> /** called when the activity is first created. */<br> @override<br> public void oncreate(bundle savedinstancestate) {<br> super.oncreate(savedinstancestate);<br> setcontentview(r.layout.main);<br> final file appfolder = new file( "/sdcard" );<br> arraylist<file> files = getfiles( appfolder,<br> true );<br> packagemanager pm = getpackagemanager( );<br> for ( int i = 0, size = files.size( ); i < size; i++ )<br> {<br> file f = files.get( i );<br> packageinfo pi= pm.getpackagearchiveinfo( f.getabsolutepath( ), 0 );<br> if ( pi != null )<br> {<br> apkinfo holder = new apkinfo( );<br> holder.file = f;<br> holder.pkgname = pi.packagename;<br> holder.size = f.length( );<br> holder.sizestring = formatter.formatfilesize( mainactivity.this,<br> holder.size );<br> holder.version = pi.versionname == null ? string.valueof( pi.versioncode )<br> : pi.versionname;<br> system.out.println("file="+f+"pkgname="+holder.pkgname +"size"+holder.sizestring+"version"+holder.version );<br> }<br> }
}<br> <br> <br> arraylist<file> getfiles( file parent, final boolean recursive )<br> {<br> final arraylist<file> files = new arraylist<file>( );
filefilter filter = new filefilter( ) {
public boolean accept( file f )<br> {<br> if ( f.isfile( )<br> && f.getname( ).tolowercase( ).endswith( ".apk" ) )
{<br> files.add( f );<br> }<br> else if ( recursive && f.isdirectory( ) )<br> {<br> try<br> {<br> // try skip links<br> if ( f.getabsolutepath( )<br> .equals( f.getcanonicalpath( ) ) )<br> {<br> f.listfiles( this );<br> }<br> }<br> catch ( exception e )<br> {<br> log.e( mainactivity.class.getname( ),<br> e.getlocalizedmessage( ),<br> e );<br> }<br> }<br> return false;<br> }<br> };
parent.listfiles( filter );
return files;<br> }<br> <br> <br> /**<br> * apkinfo<br> */<br> private static final class apkinfo<br> {
file file;<br> charsequence label;<br> string pkgname;<br> string version;<br> string sizestring;<br> long size;<br> drawable icon;<br> int installed;<br> boolean checked;
apkinfo( )<br> {
}<br> }<br>}
最新技术文章: