Android的一些知识---生生不息

1. Provision  

本知识点转载于:http://blog.csdn.net/thl789/article/details/7803439

Android中很多框架性的设计都已经存在了,但在市场上的发布版本里却因为没有很好的理解Android的设计意图而进行自己的定制,或者自己又做一个冗余的实现。Android中的Provision其实就是类似刚出厂时或者恢复出厂设置之后,一步一步引导用户完成各种设置的Setup Wizard程序。

 

在Android的原生代码中,Provision并没有被编译进系统,这可能是Provision不被人所知的原因。另外SdkSetup是一个实现相同功能的程序,从名字来看,SdkSetup是被用来在模拟环境中完成初始设置的程序。

 

Provision在其AndroidManifest.xml中被定义如下:

[html]  view plain copy
  1. <application>  
  2.    <activity android:name="DefaultActivity"  
  3.            android:excludeFromRecents="true">  
  4.        <intent-filter android:priority="1">  
  5.             <action android:name="android.intent.action.MAIN" />  
  6.             <category android:name="android.intent.category.HOME" />  
  7.             <category android:name="android.intent.category.DEFAULT" />  
  8.        </intent-filter>  
  9.    </activity>  
  10. lt;/application>  
 

Activity DefaultActivity的category被定义成HOME,并且priority为1,是比系统Launcher启动还要早的程序。

 

Provision中DefaultActivity的实现如下:

[java]  view plain copy
  1. public class DefaultActivity extendsActivity {  
  2.    @Override  
  3.    protected void onCreate(Bundle icicle) {  
  4.        super.onCreate(icicle);  
  5.   
  6.        // Add a persistent setting to allow other apps to know the device hasbeen provisioned.  
  7.        Settings.Secure.putInt(getContentResolver(),Settings.Secure.DEVICE_PROVISIONED, 1);  
  8.   
  9.        // remove this activity from the package manager.  
  10.        PackageManager pm = getPackageManager();  
  11.        ComponentName name = new ComponentName(this, DefaultActivity.class);  
  12.        pm.setComponentEnabledSetting(name,PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);  
  13.   
  14.        // terminate the activity.  
  15.        finish();  
  16.     }  
  17. }  
 

DefaultActivity的原生实现只做了两件事:

  1. 没有UI界面,只是设置Setting项里的Settings.Secure.DEVICE_PROVISIONED为1,指示其他Framework和其他程序,机器已经Provisioned。
  2. Line#10~#12之后,Launcher才会被启动,完成整个启动过程。

注意:还没有Provisioned的机器,有些功能的表现是不一样的。比如,如果还没有Provisioned,锁屏程序不会锁屏;对HOME key的处理也不同;电话也是打不进来的,etc。

 

通过Provision,可以定制:

  •  加入一些初始设置项的设定,比如时区/时间初始设定,背景数据是否允许,是否允许安装非Android市场上的程序,等不需要用户干预就可以完成的设置。具体也可看SdkSetup中的DefaultActivity完成的设置,除了多了些设置项的设置,并没有太多区别。
  •  加入UI设计,引导用户一步步完成需要用户参与选择或输入的设置过程,也就是Setup Wizard的工作。
2.Android Activity 属性大全

activity属性设置大全
android:allowTaskReparenting=["true" | "false"]
        是否允许activity更换从属的任务,比如从短信息任务 切换到浏览器任务。

android:alwaysRetainTaskState=["true" | "false"]
        是否保留状态不变, 比如切换回home, 再从新打开, activity处于最后的状态 
  
android:clearTaskOnLaunch=["true"" | "false"]
        比如 P 是 activity, Q 是被P 触发的 activity, 然后返回Home, 从新启动 P, 是否显示 Q         

    android:configChanges=[one or more of: "mcc" "mnc" "locale" "touchscreen" "keyboard" "keyboardHidden" "navigation" "orientation" "fontScale"]
   当配置list发生修改时, 是否调用 onConfigurationChanged() 方法 比如 "locale|navigation|orientation".        
android:enabled=["true" | "false"]
        activity 是否可以被实例化,        

android:excludeFromRecents=["true" | "false"]
        是否可被显示在最近打开的activity列表里     

    android:exported=["true" | "false"]
        是否允许activity被其它程序调用        

android:finishOnTaskLaunch=["true" | "false"]
        是否关闭已打开的activity当用户重新启动这个任务的时候    

    android:icon="drawable resource"         
android:label="string resource"        

android:launchMode=["multiple" | "singleTop" |"singleTask" | "singleInstance"]
        activity启动方式, "standard" "singleTop" "singleTask" "singleInstance" 其中前两个为一组, 后两个为一组       

android:multiprocess=["true" | "false"]          
android:name="string"          
android:noHistory=["true" | "false"] 
        是否需要移除这个activity当用户切换到其他屏幕时。 这个属性是 API level 3 中引入的        
android:permission="string"       

android:process="string"
   一个activity运行时所在的进程名,所有程序组件运行在应用程序默认的进程中,这个进程名跟应用程序的包名一致。
   <application>中的元素process属性能够为所有组件设定一个新的默认值。但是任何组件都可以覆盖这个默认值,允许你
   将你的程序放在多进程中运行。 如果这个属性被分配的名字以:开头,当这个activity运行时,一个新的专属于这个程序的
   进程将会被创建。如果这个进程名以小写字母开头,这个activity将会运行在全局的进程中,被它的许可所提供。      

android:screenOrientation=["unspecified" | "user" | "behind" |"landscape" | "portrait" | "sensor" | "nonsensor"]
        activity显示的模式, "unspecified" 默认值 "landscape" 风景画模式,宽度比高度大一些 "portrait" 肖像模式, 高度比
   宽度大。 "user" 用户的设置 "behind" "sensor" "nosensor"        

android:stateNotNeeded=["true" | "false"]
        是否 activity被销毁和成功重启并不保存状态

android:taskAffinity="string"
        activity的亲属关系, 默认情况同一个应用程序下的activity有相同的关系    

     android:theme="resource or theme"
        activity的样式主题, 如果没有设置,则activity的主题样式从属于应用程序, 参见<application>元素的theme属性        

android:windowSoftInputMode=[one or more of: "stateUnspecified""stateUnchanged" "stateHidden" "stateAlwaysHidden"      
   "stateVisible""stateAlwaysVisible""adjustUnspecified""adjustResize" "adjustPan"] > 
   activity主窗口与软键盘的交互模式, 自从API level 3 被引入  


2. 把布局转化成bitmap

  
        int width = mainLayout.getWidth();
        int height = mainLayout.getHeight();
        mainLayout.setDrawingCacheEnabled(true);
        mainLayout.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),  
                MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));  
        mainLayout.layout(0, 0, width, height);  
       // mainLayout.buildDrawingCache(true);
        Bitmap mainBitmap = mainLayout.getDrawingCache(true);

 记得回收bitmap
mainLayout.destroyDrawingCache();    

3.今天遇到ImageView 重新设置Bitmap时 其父布局会重新定义到原始位置(因为需求,是relative其marginLeft  跟MarginTop 已改改变)
解决方法是:父布局继承一个RelativeLayout   修改  onLayout方法
 @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        if (changed){  // 修改第一次setInsideView时会重新复位到原始位置
            super.onLayout(changed, l, t, r, b);
        }
    }

你可能感兴趣的:(Android的一些知识---生生不息)