最近整理的Android学习笔记

今天记录一下这段时期学习android的笔记,这些笔记比较凌乱,但总归是有用的,以后什么时候有用,可以直接查询来使用。

Android沉浸式状态栏

如果想要我们的应用打开以后和状态栏的颜色保持一致,或者是我们自己定义的颜色,可以这样来做:

布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:background="#009959"
        android:clipToPadding="true"
        android:fitsSystemWindows="true" />

    <Button
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:background="#ff669d" />

</LinearLayout>

这里为textView设置了如下两个属性:

android:clipToPadding=”true”

android:fitsSystemWindows=”true”

之所以设置textview是因为我们在改textview中指定了颜色,即状态栏显示的颜色。

引用布局:

this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

这样就完成了一个沉浸式的状态栏。

android实现截屏的效果

//构建Bitmap  

WindowManager windowManager = getWindowManager();  

Display display = windowManager.getDefaultDisplay();  

int w = display.getWidth();  

int h = display.getHeight();  

Bitmap Bmp = Bitmap.createBitmap( w, h, Config.ARGB_8888 );      

//获取屏幕  

View decorview = this.getWindow().getDecorView();   

decorview.setDrawingCacheEnabled(true);   

Bmp = decorview.getDrawingCache();

SpannableString美化文字

SpannableString string = new SpannableString("test百度");
string.setSpan(new AbsoluteSizeSpan(50),3,5, Spannable.SPAN_POINT_POINT);
textView.setText(string);

SpannableString string = new SpannableString("test百度9465fhghfjhg");
string.setSpan(new StyleSpan(Typeface.ITALIC),3,9, Spannable.SPAN_POINT_POINT);
textView.setText(string);

SpannableString string = new SpannableString("test百度9465fhghfjhg");
string.setSpan(new BackgroundColorSpan(Color.argb(187,200,155,200)),3,9, Spannable.SPAN_POINT_POINT);
textView.setText(string);

SpannableString string = new SpannableString("test百度9465fhghfjhg");
string.setSpan(new ForegroundColorSpan(Color.argb(187,200,155,200)),3,9, Spannable.SPAN_POINT_POINT);

SpannableString string = new SpannableString("test百度9465fhghfjhg");
string.setSpan(new URLSpan("百度"),3,9, Spannable.SPAN_POINT_POINT);

SpannableString string = new SpannableString("test百度9465fhghfjhg");
string.setSpan(new ScaleXSpan(0.618f),3,9, Spannable.SPAN_POINT_POINT);

SpannableString string = new SpannableString("test百度9465fhghfjhg");
string.setSpan(new QuoteSpan(),3,9, Spannable.SPAN_POINT_POINT);

SpannableString string = new SpannableString("test百度9465fhghfjhg");
string.setSpan(new StrikethroughSpan(),3,9, Spannable.SPAN_POINT_POINT);

string.setSpan(new RelativeSizeSpan((float) Math.PI),3,9, Spannable.SPAN_POINT_POINT);

android.media.ExifInterface使用

android 2.0开始 加入的 android.media.ExifInterface 包中如下方法读取多媒体文件相关信息:

/**
  *
  * 目前Android SDK定义的Tag有:
  * TAG_DATETIME 时间日期
  * TAG_FLASH 闪光灯
  * TAG_GPS_LATITUDE 纬度
  * TAG_GPS_LATITUDE_REF 纬度参考
  * TAG_GPS_LONGITUDE 经度
  * TAG_GPS_LONGITUDE_REF 经度参考
  * TAG_IMAGE_LENGTH 图片长
  * TAG_IMAGE_WIDTH 图片宽
  * TAG_MAKE 设备制造商
  * TAG_MODEL 设备型号
  * TAG_ORIENTATION 方向
  * TAG_WHITE_BALANCE 白平衡
  */
String path = "/storage/extSdCard/mayi/fault_images/" + filename;//图片完整路径
System.out.println(path);
ExifInterface ext = new ExifInterface(path);//获取图片信息
int image_length = Integer.parseInt(ext.getAttribute(ExifInterface.TAG_IMAGE_LENGTH));
int image_width = Integer.parseInt(ext.getAttribute(ExifInterface.TAG_IMAGE_WIDTH));

manifest的一些属性

当给某一个activity设置android:excludeFromRecents=”true”的时候,就不会在最近使用的应用里边看到该activity

android:alwaysRetainTaskState

是否保留状态不变, 比如切换回home, 再从新打开, activity处于最后的状态

android:clearTaskOnLanunch

比如 P 是 activity, Q 是被P 触发的 activity, 然后返回Home, 从新启动 P, 是否显示 Q

android:finishOnTaskLaunch

是否关闭已打开的activity当用户重新启动这个任务的时候

android:onHistory

是否需要移除这个activity当用户切换到其他屏幕时。 这个属性是 API level 3 中引入的

android:screenOrientation

activity显示的模式, “unspecified” 默认值 “landscape” 风景画模式,宽度比高度大一些 “portrait” 肖像模式, 高度比宽度大。 “user” 用户的设置 “behind” “sensor” “nosensor”

android:allowTaskReparenting(‘true’ or ‘false’)

是否允许activity更换从属的任务,比如从短信息任务切换到浏览器任务

创建和删除app快捷方式

/**
 * 为程序创建桌面快捷方式
 */
private void addShortcut(){
        Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");     

    //快捷方式的名称
    shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));
    shortcut.putExtra("duplicate", false); //不允许重复创建     

    //指定当前的Activity为快捷方式启动的对象: 如 com.everest.video.VideoPlayer
    //注意: ComponentName的第二个参数必须加上点号(.),否则快捷方式无法启动相应程序
        ComponentName comp = new ComponentName(this.getPackageName(), "."+this.getLocalClassName());
        shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_MAIN).setComponent(comp));     

    //快捷方式的图标
    ShortcutIconResource iconRes = Intent.ShortcutIconResource.fromContext(this, R.drawable.icon);
    shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconRes);
    sendBroadcast(shortcut);
 }  

/**
 * 删除程序的快捷方式
 */
private void delShortcut(){
      Intent shortcut = new Intent("com.android.launcher.action.UNINSTALL_SHORTCUT");     

        //快捷方式的名称
        shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));     

        //指定当前的Activity为快捷方式启动的对象: 如 com.everest.video.VideoPlayer
        //注意: ComponentName的第二个参数必须是完整的类名(包名+类名),否则无法删除快捷方式
        String appClass = this.getPackageName() + "." +this.getLocalClassName();
        ComponentName comp = new ComponentName(this.getPackageName(), appClass);
        shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_MAIN).setComponent(comp));     

        sendBroadcast(shortcut);     

    }   

另外记得添加以下权限:

<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" /> 

pm命令的使用

adb shell pm list package -e  列出手机上可用的所有应用
pm list packages -d    列出手机上不可用的所有应用、
pm list packages -s    列出手机上的系统应用
pm enable com.tct.note   使应用可用
pm disable com.tct.note   是应用不可用
pm path com.tct.note   打印出该包名所对应的apk的完整路径
pm list packages    查看手机上所有的应用的包名
pm list permission-groups   列出手机上的所有的权限组
pm list permissions  列出手机上所有的权限
pm list features   列出手机上的硬件功能
pm dump com.tct.note > storage/sdcard0/temp/dump.txt  将该应用的相关信息输出到文件
pm get-install-location com.tct.note  得到应用安装的路径  0:自动  1:内部存储   2:外部存储
aapt dump badging /local/pertest.apk  列出  中的详细信息
aapt dump permissions /local/pertest.apk  列出 中使用的权限

adb shell am start –n activityName
adb shell am kill +package
adb shell am force-stop +package

dumpsys命令的使用

adb shell dumpsys notification
adb shell dumpsys activity---------------查看ActvityManagerService 所有信息
adb shell dumpsys activity activities----------查看Activity组件信息
adb shell dumpsys activity services-----------查看Service组件信息
adb shell dumpsys activity providers----------产看ContentProvider组件信息
adb shell dumpsys activity broadcasts--------查看BraodcastReceiver信息
adb shell dumpsys activity intents--------------查看Intent信息
adb shell dumpsys activity processes---------查看进程信息

adb shell dumpsys battery
adb shell dumpsys cpuinfo
adb shell dumpsys meminfo
adb shell dumpsys activity
adb shell dumpsys activity top  获取当前界面的ui信息
adb shell dumpsys package   获取包的信息
adb shell dumpsys package com.android.mms 获取某一个包的信息
adb shell dumpsys notification  获取notification的信息
adb shell dumpsys power
adb shell dumpsys wifi
获取电话信息:
adb shell dumpsys telephony.registry
可以获取到电话状态,例如
mCallState值为0,表示待机状态、1表示来电未接听状态、2表示电话占线状态
mCallForwarding=false #是否启用呼叫转移
mDataConnectionState=2 #0:无数据连接 1:正在创建数据连接 2:已连接
mDataConnectionPossible=true  #是否有数据连接
mDataConnectionApn=   #APN名称

onTrimMemory学习

onTrimMemory()是Android 4.0之后提供的API,系统会根据不同的内存状态来回调。根据不同的内存状态,来响应不同的内存释放策略。

OnTrimMemory的参数是一个int数值,代表不同的内存状态:

TRIM_MEMORY_COMPLETE:内存不足,并且该进程在后台进程列表最后一个,马上就要被清理

TRIM_MEMORY_MODERATE:内存不足,并且该进程在后台进程列表的中部。

TRIM_MEMORY_BACKGROUND:内存不足,并且该进程是后台进程。

TRIM_MEMORY_UI_HIDDEN:内存不足,并且该进程的UI已经不可见了。

以上4个是4.0增加

TRIM_MEMORY_RUNNING_CRITICAL:内存不足(后台进程不足3个),并且该进程优先级比较高,需要清理内存

TRIM_MEMORY_RUNNING_LOW:内存不足(后台进程不足5个),并且该进程优先级比较高,需要清理内存

TRIM_MEMORY_RUNNING_MODERATE:内存不足(后台进程超过5个),并且该进程优先级比较高,需要清理内存

setContentView之后获得空间宽和高

如果在setContentView之后就尝试获得空间的宽和高,此时会得到0,因为此时还没有执行onMeasure方法,可以尝试如下两种解决方案:


 方法一:
        int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
        int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
        ssidtext.measure(w, h);
        int width =ssidtext.getMeasuredWidth();
        int height =ssidtext.getMeasuredHeight();

方法二:
        ViewTreeObserver vto = ssidtext.getViewTreeObserver();
        vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            public boolean onPreDraw() {
                int height = ssidtext.getMeasuredHeight();
                int width = ssidtext.getMeasuredWidth();
                return true;
            }
        });

手机root之后

android中锁屏密码都是存在:/data/system/ 目录下的

我们可以查看后缀名是.key的文件,因为有很多种锁屏方案:手势密码,文本密码,PIN密码等,所以会有相对应的文件,我们只要找到对应的文件,然后将其删除即可。

其实每次连接上的wifi之后,系统会将这些wifi信息存储到指定文件中,在/data/misc/wifi/ 目录下面,然后查看wpa_supplicant.conf文件内容即可

设置屏幕显示方向

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//通过程序改变屏幕显示的方向 

    1.landscape:横屏(风景照) ,显示时宽度大于高度;  

     2.portrait:竖屏 (肖像照) , 显示时 高 度大于 宽 度 ;  

     3.user:用户当前的首选方向;  

     4.behind:继承Activity堆栈中当前Activity下面的那个Activity的方向;  

     5.sensor:由物理感应器决定显示方向,它取决于用户如何持有设备,当 设备 被旋转时方向会随之变化——在横屏与竖屏之间;  

     6.nosensor:忽略物理感应器——即显示方向与物理感应器无关,不管用户如何旋转设备显示方向都不会随着改变("unspecified"设置除外);  

     7.unspecified :未指定,此为默认值,由Android系统自己选择适当的方向,选择策略视具体设备的配置情况而定,因此不同的设备会有不同的方向选择;

screenrecord的使用

adb shell screenrecord /sdcard/demo.mp4

限制录制时间:

adb shell screenrecord –time-limit 10 /sdcard/demo.mp4

指定视频分辨率的大小

adb shell screenrecord –size 1280*720 /sdcard/demo.mp4

指定视频比特率:比特率越大,视频质量越好

adb shell screenrecord –bit-rate 6000000 /sdcard/demo.mp4

scrollView滚动到屏幕底部

scrollView.fullScroll(ScrollView.FOCUS_DOWN);滚动到底部

scrollView.fullScroll(ScrollView.FOCUS_UP);滚动到顶部

需要注意的是,该方法不能直接被调用,因为Android很多函数都是基于消息队列来同步,所以需要一部操作,addView完之后,不等于马上就会显示,而是在队列中等待处理,虽然很快,但是如果立即调用fullScroll, view可能还没有显示出来,所以会失败,应该通过handler在新线程中更新

handler.post(new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    });  

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 13:59:36

最近整理的Android学习笔记的相关文章

七、Android学习笔记_JNI hello world

1.需要准备的工具,eclipse,cdt(c++)插件,cygwin(unix)和 android ndk. 在cygwin的etc目录下将ndk的路径引入到profile文件中,可以在cygwin的任何目录都可以访问到ndk,不同的ndk路径PATH的写法不同. : ${ORIGINAL_PATH=${PATH}} if [ ${CYGWIN_NOWINPATH-addwinpath} = "addwinpath" ] ; then PATH="/usr/local/bi

Android学习笔记——关于onConfigurationChanged

从事Android开发,免不了会在应用里嵌入一些广告SDK,在嵌入了众多SDK后,发现几乎每个要求在AndroidManifest.xml申明Activity的广告SDK都会要求加上注明这么一句属性: android:configChanges="orientation|keyboard|keyboardHidden" 通过查阅Android API可以得知android:onConfigurationChanged实际对应的是Activity里的onConfigurationChan

Android学习笔记18:自定义Seekbar拖动条式样

Android学习笔记18:自定义Seekbar拖动条式样

Pro Android学习笔记(三三):Menu(4):Alternative菜单

什么是Alternative menu(替代菜单) 举个例子,Activity显示一个文本文件.如果用户想对文本文件进行编辑,Activity不提供编辑能力,但可由其他activity或者其他应用提供.我们将相关信息存储在一个intent中,例如该文本的Uri.这个intent可以匹配系统的多个应用,替代菜单将这些应用一一列出,菜单项的title就是该可被调用的activity的名字,图标也为该可被调用的activity的图表. 小例子说明 我们通过一个小例子进行学习,简单地打开一个URL:we

Android学习笔记(二二): 多页显示-Tag的使用

在手机屏幕中,Tab也是比较常用的,通常和List结合,例如我们手机的通信录.下面是Tag的结构. TabHost是整个Tab的容器,包括两部分,TabWidget和FrameLayout.TabWidget就是每个tab的标签,FrameLayout则是tab内容. 如果我们使用extends TabAcitivty,如同ListActivity,TabHost必须设置为@android:id/tabhost TabWidget必须设置android:id为@android:id/tabs F

android学习笔记--android启动过程之init.rc文件浅析

1.  init.rc文件结构文件位置:init.c  : /system/core/initinit.rc  : /system/core/rootdir 首先init.rc文件是以模块为单位的,每个模块里的内容都是一起执行的,模块分为3种类型:on.service.import.我们可以看下init.rc文件是怎么写的:1.import import /init.usb.rc import /init.${ro.hardware}.rc import /init.trace.rc 上面的内容

android学习笔记——利用BaseAdapter生成40个列表项

RT: main.xml ? 1 2 3 4 5 6 7 8 9 10 11 12 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"               android:orientation="vertical"        

Android学习笔记_78_ Android开发中使用软引用和弱引用防止内存溢出

在<Effective Java 2nd Edition>中,第6条"消除过期的对象引用"提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象池.缓存中的过期对象都有可能引发内存泄露的问题.书中还提到可以用 WeakHashMap来作为缓存的容器可以有效解决这一问题.之前也确实遇到过类似问题,但是没有接触过"弱引用"相关的问题,于是查阅了一些资料. <Java 理论与实践: 用弱引用堵住内存泄漏>

Android学习笔记(十四)——在运行时添加碎片(附源码)

在运行时添加碎片 点击获取源码 将UI分割为多个可配置的部分是碎片的优势之一,但其真正强大之处在于可在运行时动态地把它们添加到活动中. 1.使用上一篇创建的Fragments项目,在main.xml文件中注释掉两个<fragment>元素: 2.在FragmentActivity.java中添加下面的代码: FragmentManager fragmentManager = getSupportFragmentManager();//向活动添加碎片 FragmentTransaction fr