完美者(wmzhe.com)网站以软件下载为基础,改版后的网站对功能性板块进行扩充,以期能够解决用户在软件使用过程中遇见的所有问题。网站新增了“软件百科”、“锦囊妙技”等频道,可以更好地对用户的软件使用全周期进行更加专业地服务。
免费、体积小巧且功能强大的剪贴板辅助工具,最多可记录高达九十九组的资料,使用方式更是简单,只要对着欲贴上的项目连按两下,就可以将文字贴上目的位置了。可曾发现我们键盘上的「Print Scrn SysRq」这个按键呢?它可以让我们用来撷取屏幕上的画面,但每一次只能撷取一张图片,这时我们再搭配上 Clipboard Recorder 就可以连续撷取多张图片。如果你是一个很常依赖剪贴板工具的话,Clipboard Recorder 将会是一个很不赖的辅助工具。"锦囊妙技"栏目是聚合全网软件使用的技巧或者软件使用过程中各种问题的解答类文章,栏目设立伊始,小编欢迎各路软件大神朋友们踊跃投稿,在完美者平台分享大家的独门技巧。
本站文章素材来源于网络,大部分文章作者名称佚失,为了更利于用户阅读和使用,根据需要进行了重新排版和部分改编,本站收录文章只是以帮助用户解决实际问题为目的,如有版权问题请联系小编修改或删除,谢谢合作。
软件大小:761.18 KB
Tips for conducting a successful interview So, you are going to be conducting an ethnobotanical interview. This is a wonderful chance for you to hear more about the importance of plants in human life. There is a lot to be learned from elder members of the community. This tip list is designed to help you get the most out of your interview. 1. Don’t forget your materials! You will need the interview guide we have given you, your composition notebook, a pen or pencil, a clipboard and maybe even a recorder. 2. Make sure you introduce yourself to the person you are interviewing. Be friendly and listen well. 3. Take a look at your interview guide. Say you just asked the question, “Where were you born?” The person you are interviewing might answer, “I was born in 1947, in Miami, Florida and have lived here all my life”. If this is the case, you would not have to ask the person questions like what year they were born, where they grew up, or how long they have lived in Miami! 4. If you do not understand something, don’t be afraid to ask the person you are interviewing to repeat it. 5. Try to stay on task. If the person you are interviewing starts talking about a trip to Paris or winning the lottery, don’t be rude, just try to bring them back to the subject by asking another question. 6. If you feel like you need help asking a question, or are not sure about what you should do next, don’t be afraid to ask someone to help you. 7. Most importantly, have fun!
你要定制一个Android系统,你想用你自己的Launcher(Home)作主界面来替换Android自己的Home,而且不希望用户安装的Launcher来替换掉你的Launcher.我们可以通过修改Framework来实现这样的功能。这里以Android2.1的源代码为例来实际说明。1)首先了解一下Android的启动过程。Android系统的启动先从Zygote开始启动,然后......(中间的过程就不说了).....一直到了SystemServer(framework)这个地方,看到这段代码:/*** This method is called from Zygote to initialize the system. This will cause the native* services (SurfaceFlinger, AudioFlinger, etc..) to be started. After that it will call back* up into init2() to start the Android services.*/native public static void init1(String[] args);public static void main(String[] args) {if (SamplingProfilerIntegration.isEnabled()) {SamplingProfilerIntegration.start();timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {SamplingProfilerIntegration.writeSnapshot("system_server");}}, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);}// The system server has to run all of the time, so it needs to be// as efficient as possible with its memory usage.VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);System.loadLibrary("android_servers");init1(args);}public static final void init2() {Log.i(TAG, "Entered the Android system server!");Thread thr = new ServerThread();thr.setName("android.server.ServerThread");thr.start();}}从SystemServer的main函数开始启动各种服务。首先启动init1,然后启动init2.从上面的注释可以看到:init1这个方法时被Zygote调用来初始化系统的,init1会启动native的服务如SurfaceFlinger,AudioFlinger等等,这些工作做完以后会回调init2来启动Android的service。这里我们主要来关注init2的过程。init2中启动ServerThread线程,ServerThread中启动了一系列的服务,比如这些:ActivityManagerServiceEntropyServicePowerManagerServiceTelephonyRegistryPackageManagerServiceAccountManagerServiceBatteryServiceHardwareServiceWatchdogSensorServiceBluetoothServiceStatusBarServiceClipboardServiceInputMethodManagerServiceNetStatServiceConnectivityServiceAccessibilityManagerServiceNotificationManagerServiceMountServiceDeviceStorageMonitorServiceLocationManagerServiceSearchManagerServiceFallbackCheckinServiceWallpaperManagerServiceAudioServiceBackupManagerServiceAppWidgetService这些大大小小的服务起来以后,开始((ActivityManagerService)ActivityManagerNative.getDefault()).systemReady()在systemReady后开始开始启动Launcher。在寻找Launcher的时候是根据HOME的filter(在Manifest中定义的<category android:name="android.intent.category.HOME" />)来过滤。然后根据filter出来的HOME来启动,如果只有一个HOME,则启动这个HOME,如果用户自己装了HOME,那就会弹出来一个列表供用户选择。我们现在希望从这里弹出我们自己定制的Launcher,同时也不希望弹出选择HOME的界面,我们不希望用户修改我们的home,比如我们的home上放了好多广告,以及强制安装的程序,不希望用户把它干掉。我们可以通过这样来实现:2) 定义一个私有的filter选项,然后用这个选项来过滤HOME.一般情况下我们使用Manifest中定义的<category android:name="android.intent.category.HOME"来过滤的,我们现在增加一个私有的HOME_FIRST过滤。在Intent.java(frameworks/base/core/java/android/content/Intent.java)中添加两行代码//lixinso:添加CATEGORY_HOME_FIRST@SdkConstant(SdkConstantType.INTENT_CATEGORY)public static final String CATEGORY_HOME_FIRST = "android.intent.category.HOME_FIRST";3)修改和CATEGORY_HOME相关的所有的地方,都改成HOME_FIRST,主要是framework中的这几个地方:frameworks/base/services/java/com/android/server/am/ActivityManagerService.java中//intent.addCategory(Intent.CATEGORY_HOME);改成intent.addCategory(Intent.CATEGORY_HOME_FIRST); //lixinso://if (r.intent.hasCategory(Intent.CATEGORY_HOME)) {改成if (r.intent.hasCategory(Intent.CATEGORY_HOME_FIRST)) { //lixinso: Intent.CATEGORY_HOME -> Intent.CATEGORY_HOME_FIRSTframeworks/base/services/java/com/android/server/am/HistoryRecorder.java中// _intent.hasCategory(Intent.CATEGORY_HOME) &&改成 _intent.hasCategory(Intent.CATEGORY_HOME_FIRST) && //lixinso: Intent.CATEGORY_HOME->Intent.CATEGORY_HOME_FIRSTframeworks/policies/base/mid/com/android/internal/policy/impl/MidWindowManager.java中//mHomeIntent.addCategory(Intent.CATEGORY_HOME); 改成 mHomeIntent.addCategory(Intent.CATEGORY_HOME_FIRST); //lixinsoframeworks/policies/base/mid/com/android/internal/policy/impl/RecentApplicationsDialog.java中//new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME),0);改成 new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME_FIRST),0); //lixinsoframeworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java中//mHomeIntent.addCategory(Intent.CATEGORY_HOME);改成 mHomeIntent.addCategory(Intent.CATEGORY_HOME_FIRST); //lixinsoframeworks/policies/base/phone/com/android/internal/policy/impl/RecentApplicationsDialog.java中//ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME),0);改成 ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME_FIRST),0); //lixinso4) 写一个自己的Launcher.可以参考android sample中的Launcher,或者android源代码中的 /packages/apps/Launcher 来写。在Launcher中标记其是不是Launcher的最关键的代码时Manifest中的filter:android:name="android.intent.category.HOME"现在我们定义了自己的filter,那么,我们在我们自己写的Launcher中将Manifest改为:<application android:process="android.process.acore3" android:icon="@drawable/icon" android:label="@string/app_name"><activity android:name=".FirstAppActivity"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.HOME_FIRST" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.MONKEY" /></intent-filter></activity></application>然后将编译好的apk放到/out/target/product/generic/system/app目录下。5)将Android自带的Launcher删除掉,包括源代码(packages/apps/Launcher)和apk(/out/target/product/generic/system/app/Launcher.apk)。6)做完这些工作,就可以重新编译Android了,我们可以编译修改过的几个相关的包。如果之前编译过了Android源码,可以用mmm命令来编译部分的改动。这里需要这样编译:$ . build/envsetup.sh $ mmm frameworks/base$ mmm frameworks/base/services/java$ mmm frameworks/policies/base/mid$ mmm frameworks/policies/base/phone7)编译完成后重新生成img文件。$ make snod8) 现在可以启动Android模拟器来看效果了。首先设置环境变量:$ export ANDROID_PRODUCT_OUT= ./out/target/product/generic然后切换到$ cd ./out/host/linux-x86/bin运行$ ./emulator这样我们启动的模拟器里面用的image就是我们刚才编译好的自己定制的东西了。从模拟器上可以看到启动的Launcher是我们自己的Launcher,不会出现默认的Launcher了,也不会出现选择界面。9)我们再验证一下,如果用户装上了一个其他的Launcher(Home)会怎么样。从网上找一个一般的Launcher或者自己写一个一般的Launcher装上去,重新启动,不会出现选择界面。按HOME键也不会出来两个HOME来选择。
剪贴板
Clipboard 剪贴板。 这个是计算机里常用的,用来暂时存放删除或者拷贝的数据。这些数据可以在下一次粘贴操作的时候用。