droid

阅读 / 问答 / 标签

如何在android的源代码中添加persist属性

  SystemProperties与Settings.System    1 使用 SystemProperties.get  如果属性名称以“ro.”开头,那么这个属性被视为只读属性。一旦设置,属性值不能改变。  如果属性名称以“persist.”开头,当设置这个属性时,其值也将写入/data/property。    在c++中就是对应JAVA的两个函数就是property_set, property_get,其实JAVA是通过JNI调用这两个函数的。  JAVA代码如下:  import android.os.SystemProperties;  SystemProperties.set("persist.sys.language", zone.getID());  String lang= SystemProperties.get("persist.sys.language");  获取方法:  boolean fastfoodenable = SystemProperties.getBoolean("persist.sys.fastfoodenable", false);  设置方法:  SystemProperties.set("persist.sys.fastfoodenable", "true");    C  #include <cutils/properties.h>  property_set("persist.sys.language", "zh");  property_get("persist.sys.language", propLang, "en");  在adb shell可以通过以下的命名读取和修改  #getprop persist.sys.language  #setprop persist.sys.language zh    创建与修改android属性用Systemproperties.set(name, value),获取android属性用Systemproperties.get(name),需要注意的是android属性的名称是有一定的格式要求的,如下: 前缀必须用systemcoreinitproperty_service.c中定义的前缀 ,进行系统属性设置的程序也必须有system或root权限  如果我们要添加一个property:例如:silvan_liu  路径:system/core/rootdir/int.rc  在on post-fs-data 目录下  setprop persist.sys.silvan_liu 1//persist.sys 前缀名; 1为初始值  PS:不同前缀名权限不同,这里就不一一说明;还有为什么要加载on post-fs-data目录下,这和int.rc的语法有关        2 使用 Settings.System.putInt  这种方式会保存变量到Settings 数据库中,飞行模式等的开关就是用这种方式实现的。  首先需要定义一个系统属性值  路径:frameworks/base/core/java/android/provider/Settings.java  public static final String VIVIEN_FASTFOOD= "hungry";  1)获取方法如下:  @Override  public void onResume()  {  super.onResume();  if(Settings.System.getInt(getContentResolver(), Settings.System.VIVIEN_FASTFOOD,0)==1)  {  mYesORNo.setChecked(true);  }  else  mYesORNo.setChecked(false);  }  2)设置  if (mYesORNo.isChecked()) {  Settings.System.putInt(getContentResolver(),  Settings.System.VIVIEN_FASTFOOD, 1);  } else {  Settings.System.putInt(getContentResolver(),  Settings.System.VIVIEN_FASTFOOD, 0);  }    需要import android.provider.Settings;  android源码开发中,常常要用到一些全局标志或者说变量,这时候我们可以给android系统添加自己想要的属性。  1.Settings.system  这种系统属性我们经常用到,例如飞行模式的开启和关闭,我们就是去改变Settings.system.AIRPLANE_MODE_ON 的值。  下面就介绍下我们怎样去定义一个系统属性。例如要添加一个属性名为“SILVAN_LIU”  路径:frameworks/base/core/java/android/provider/Settings.java    public static final String SILVAN_LIU = "silvan_liu";  public static final String[] SETTINGS_TO_BACKUP ={  ~  +SILVAN_LIU  ~  }  这样添加后,你就是可以通过Settings.System.getInt(getContentResolver(), Settings.System.SILVAN_LIU,0) 和Settings.System.getInt(getContentResolver(), Settings.System.SILVAN_LIU,0)去得到和设定SILVAN_LIU的属性值。    2.SystemProperties  创建与修改android属性用Systemproperties.set(name, value),获取android属性用Systemproperties.get(name),需要注意的是android属性的名称是有一定的格式要求的,如下: 前缀必须用systemcoreinitproperty_service.c中定义的前缀 ,进行系统属性设置的程序也必须有system或root权限  如果我们要添加一个property:例如:silvan_liu  路径:system/core/rootdir/int.rc  在on post-fs-data 目录下  setprop persist.sys.silvan_liu 1//persist.sys 前缀名; 1为初始值  PS:不同前缀名权限不同,这里就不一一说明;还有为什么要加载on post-fs-data目录下,这和int.rc的语法有关。    以上是我实际项目中运用到的地方,可能认识的不够深刻,还需继续摸索。转载

android 可以使用dubbo吗

可以的DUBBO配置规则详解研究DUBBO也已经大半年了,对它的大部分源码进行了分析,以及对它的内部机制有了比较深入的了解,以及各个模块的实现。DUBBO包含很多内容,如果想了解DUBBO第一步就是启动它,从而可以很好的使用它,那么如何更好的使用呢?就需要知道DUBBO的各个配置项,以及它可以通过哪些途径进行配置。个人对配置的理解,就好比时对动物的驯服,如何很好的驯服一头猛兽,那就需要知道它各种因子,从而调整,已达到自己期望的结果。这篇不对DUBBO有哪些配置项可以配置,但是通过这篇文章,你应该能够知道DUBBO可以进行哪些配置。本文会通过分析DUBBO加载配置源码的分析,来使得大家对DUBBO的配置一块有更加深入的了解。从而达到“驯服”DUBBO,以使得它成为你们自己的DUBBO。DUBBO在配置这一块做的确实很完美,提供很很多参数,以及提供了多种渠道。下面进入正题,看看DUBBO怎么加载配置的。在讲这些之前,先给大家介绍一下在DUBBO源码层面定义了哪些类来存储各个模块的配置项,从而了解DUBBO可以对哪些模块进行配置。哪些东西可以配置由于大部分项目都会使用Spring,而且DUBBO也提供了通过Spring来进行配置,那么先从这里进行着手。DUBBO加载Spring的集成时在dubbo-config下面的dubbo-config-spring模块下面,其中有一个类DubboNamespaceHandler,它实现了Spring提供的接口NamespaceHandlerSupport。那么Spring怎么发现整个实现类的呢?在该模块的META-INF文件夹下有两个文件: spring.handlers和spring.schemas,这两个文件里面制定了dubbo的namespace的XSD文件的位置以及dubbo的namespace由DubboNamespaceHandler来处理解析。说了这么多废话,只是想说明Spring是怎么解析<dubbo:.../>配置的。知道了DUBBO和Spring关于配置一块时怎么整合的之后,那么你应该就不会诧异Spring怎么那么聪明,能够解析dubbo的namespace。接下来看看DubboNamespaceHandler类里面有什么东西。

Android自定义layout怎么写

LinearLayout自定义方法有多种:1、自定义xml布局,然后加载布局,自定义一个View继承LinearLayout2、在自定义控件中声明它的所有子元素,然后在Layout文件中像使用LinearLayout一样去进行布局。第二种比较烦 ,它需要在Layout文件中定义好子元素之后,要在代码 onFinishInflate() 进行匹配子元素。我就说说加载布局文件的方法吧。首先:定义好layout文件<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:paddingBottom="5dip" android:paddingLeft="40dip" android:paddingTop="5dip" android:src="@drawable/right_icon" /> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="8dip" android:text="主题" android:textColor="#000000" /> <LinearLayout android:layout_width="100dp" android:layout_height="fill_parent" android:orientation="horizontal" > <ImageView android:id="@+id/imageView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:paddingBottom="5dip" android:paddingLeft="12dip" android:paddingTop="5dip" android:src="@drawable/home_icon" /> <ImageView android:id="@+id/imageView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:paddingBottom="5dip" android:paddingLeft="12dip" android:paddingTop="5dip" android:src="@drawable/add_icon" /> </LinearLayout></LinearLayout>public class MyLinearLayout extends LinearLayout { private ImageView imageView,iv_home,iv_add; private TextView textView; public MyLinearLayout (Context context) { super(context); // TODO Auto-generated constructor stub } public MyLinearLayout (Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.actionbar, this); imageView=(ImageView) findViewById(R.id.imageView1); iv_home=(ImageView) findViewById(R.id.imageView2); iv_add=(ImageView) findViewById(R.id.imageView3); textView=(TextView)findViewById(R.id.textView1);} /** * 设置图片资源 */ public void setImageResource(int resId) { imageView.setImageResource(resId); } /** * 设置显示的文字 */ public void setTextViewText(String text) { textView.setText(text); } }<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <cn.com.demo.view.MyLinearLayout android:id="@+id/ll_actionbar" android:layout_height="fill_parent<span style="font-family: Tahoma, "Microsoft Yahei", Simsun;">" </span> android:layout_width="wrap_content" android:background="@drawable/bg" /></LinearLayout>接下来自定义一个MyLinearLayout继承LinearLayout,并且加载刚刚写好的layout文件。(比如http://www.tiecou.com)public class MyLinearLayout extends LinearLayout {private ImageView imageView,iv_home,iv_add;private TextView textView;public MyLinearLayout (Context context) {super(context);// TODO Auto-generated constructor stub}public MyLinearLayout (Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stubLayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);inflater.inflate(R.layout.actionbar, this);imageView=(ImageView) findViewById(R.id.imageView1);iv_home=(ImageView) findViewById(R.id.imageView2);iv_add=(ImageView) findViewById(R.id.imageView3);textView=(TextView)findViewById(R.id.textView1);}/** * 设置图片资源 */ public void setImageResource(int resId) { imageView.setImageResource(resId); } /** * 设置显示的文字 */ public void setTextViewText(String text) { textView.setText(text); } }最后,要的时候使用定义好的MyLinearLayout控件。

Android几种layout(布局)的区别

Android几种layout(布局)的区别 1.FrameLayout:children按照从左上开始的顺序排列,主要用于tabed view或者图片切换功能;最简单的布局模型,在这种布局下每个添加的子控件都被放在布局的左上角,并覆盖在前一子控件的上层。 2.线性布局(LinearLayout):children排列成一行多列或者一列多行的形式,应该是应用程序中最常用的布局方式,它提供了控件水平或者垂直排列的模型,同时我们可通过设置子控件的weight布局参数控制各个控件在布局中的相对大小。 android:orientation="vertical"使linearlayout里面的东西一行一行排列。3.相对布局(RelativeLayout):children是相互之间相关位置或者和他们的parent位置相关,参照控件可以是父控件,也可以是其他子控件,但被参照的控件必须要在参照它的控件之前定义。相对布局模型所涉及的属性设置比较多,但并不复杂。 4.TableLayout:children按照行列的排序,类似于html的table;模型以行列的形式管理子控件,每一行为一个TableRow的对象,也可为一个View的对象。TableRow可添加子控件,每添加一个子控件为一列。 5.坐标布局(AbsoluteLayout)的子控件需要指定相对于此坐标布局的横、纵坐标值,否则将会像FrameLayout那样被排在左上角。手机应用需要适用于不同的屏幕大小,而这种布局模型不能自适应屏幕尺寸大小,所以应用得相当少。

手机里的resource_android.vfs 是什么,能不能删除?

这个是你装了大型游戏留下来的数据包,游戏通过读取这个文件才能正常游戏,如果你不想重新下载的话就别删了

啊我入手的g22 在下大型游戏的时候 提示 暂停安装sd卡不法访问,请删除SD卡中android_secure文件夹下的smdl

nininininininininininiinininininininiinniinini

怎么把android的apk 应用程序打包到userdata.img镜像当中去

有一些apk 文件比较重要的,想直接打包到系统中,开机就能使用。网上百度了一下,只有说如何把apk文件打包到system.img 里面,应该也是类似的。试试参考是否行。把第三方或自己开发的apk文件编译到系统文件(system.img)中的方法: 1 (1)源码编译后,把apk拷贝到out argetproductgenericsystemapp中。(2) 执行命令make snod , 把添加的spk编到system.img 中 缺点:执行make clean 后,再次make 完毕需要重新执行上面操作。 2 "方法一"的改进。 (1) 新建一个文件夹目录,用来存放apk文件mkdir packages/apps/Prebuilt_apps cd packages/apps/Prebuilt_apps 在Prebuilt_apps中新建make文件 vi Android.mk 并写入 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_POST_PROCESS_COMMAND := $(shell cp -r $(LOCAL_PATH)/*.apk $(TARGET_OUT)/app/) 保存退出。(2) 把需要编译的apk拷贝到目录Prebuilt_apps下,执行make ,Prebuilt_apps中的apk就会考被到out argetproductgenericsystemapp中。(3) 执行make snod 。完成。 此方法执行make clean 后,再次make 完毕,只需要make snod即可(有时make后,out argetproductgenericsystemapp没有需要添加的apk,此时再make一次即可,速度很快)。-----------------------感谢11楼提供的关于编译成功但无法运行问题的解决方法。解压apk,如其中lib(.so)文件,把 .so文件copy到systemlib下,再编译。本人在模拟器上直接加入angrybird.apk(愤怒的小鸟)编译,编译后无法运行。把libangrybirds.so拷贝到systemlib下,再编译后就可以运行。 触宝输入法apk使用此方法也可编译运行成功。--------------------使用mkyaffs2image工具,使上面的操作更简单!把apk及相关文件(如.so)拷贝到system的相应路径下,执行 mkyaffs2image -f direction/system system.img,即可生成system.img------------------------------------------------------------原文地址:http://www.eoeandroid.com/thread-58113-1-1.html俺的师弟说用 make userdataimage-nodeps 这个,这几种方法我都试试。嘿嘿。等下来报告结果。晕,不行的这样。呵呵,压根没更新userdata.img执行make userdataimage-nodeps 后两分钟左右,终端就显示下面的信息,生成了out/target/product/generic/userdata.imgTarget userdata fs image: out/target/product/generic/userdata.img我马上烧写到我的S5PV210 试试。菜鸟啊,菜鸟中前进。out/host/linux-x86/bin/mkyaffs2image -f out/target/product/smdkv210/data out/target/product/smdkv210/userdata.img——这个就可以了,不过的确存在愤怒的小鸟打包进去不能运行的问题,有些apk 文件打包进去就能运行。看来还是一些库的打包没处理好。原来是是这个android 系统被改的不成样子,用上述命令就可以顺利生成我们最新的userdata.img 了。android系统存在问题,导致下面的命令都无效。Android比较重要的三个img文件:make systemimage - system.imgmake userdataimage - userdata.imgmake ramdisk - ramdisk.imgPS:make snod - 快速打包system.img

android的文件系统怎么生成

Android源码编译后得到system.img,ramdisk.img,userdata.img映像文件。其中, ramdisk.img是emulator的文件系统,system.img包括了主要的包、库等文件,userdata.img包括了一些用户数据,emulator加载这3个映像文件后,会把 system和 userdata分别加载到 ramdisk文件系统中的system和 userdata目录下。因此,我们可以把ramdisk.img里的所有文件复制出来,system.img和userdata.img分别解压到 ramdisk文件系统中的system和 userdata目录下。2、分离Android文件系统出来system.img,ramdisk.img,userdata.img映像文件是采用cpio打包、gzip压缩的,可以通过file命令验证:file ramdisk.img 输出:ramdisk.img: gzip compressed data, from Unix, last modified: Wed Mar 18 17:16:10 2009 Android源码编译后除了生成system.img,userdata.img之外还生成system和 userdata文件夹,因此不需要解压它们。Android源码编译后还生成root文件夹,其实root下的文件与 ramdisk.img 里的文件是一样的,不过这里还是介绍怎样把 ramdisk.img解压出来:将ramdisk.img复制一份到任何其他目录下,将其

如何编译android userdata.img

1、android文件系统的结构 android源码编译后得到system.img,ramdisk.img,userdata.img映像文件。其中, ramdisk.img是emulator的文件系统,system.img包括了主要的包、库等文件,userdata.img包括了一些用户数据,emulator加载这3个映像文件后,会把 system和 userdata分别加载到 ramdisk文件系统中的system和 userdata目录下。因此,我们可以把ramdisk.img里的所有文件复制出来,system.img和userdata.img分别解压到 ramdisk文件系统中的system和 userdata目录下。 2、分离android文件系统出来 system.img,ramdisk.img,userdata.img映像文件是采用cpio打包、gzip压缩的,可以通过file命令验证: file ramdisk.img,输出: ramdisk.img: gzip compressed data, from Unix, last modified: Wed Mar 18 17:16:10 2009 Android源码编译后除了生成system.img,userdata.img之外还生成system和 userdata文件夹,因此不需要解压它们。Android源码编译后还生成root文件夹,其实root下的文件与 ramdisk.img 里的文件是一样的,不过这里还是介绍怎样把 ramdisk.img解压出来: 将ramdisk.img复制一份到任何其他目录下,将其名称改为ramdisk.img.gz,并使用命令 gunzip ramdisk.img.gz 然后新建一个文件夹,叫ramdisk吧,进入,输入命令 cpio -i -F ../ramdisk.img 这下,你就能看见并操作ramdisk里面的内容了。 然后把Android源码编译后生成的system和 userdata里的文件复制到 ramdisk/system和 ramdisk/userdata下。这样就得到一个文件系统了。 3、使用网络文件系统方式挂载android文件系统 因此,我们需要建立/nfsroot目录,再建立/nfsroot/androidfs目录,把刚才的android文件系统改名为androidfs,并链接到/nfsroot/androidfs 4、android内核引导文件系统 android内核挂载/nfsroot/androidfs之后,根据init.rc,init.goldfish.rc来初始化并装载系统库、程序等直到开机完成。init.rc脚本包括了文件系统初始化、装载的许多过程。init.rc的工作主要是: 1)设置一些环境变量 2)创建system、sdcard、data、cache等目录 3)把一些文件系统mount到一些目录去,如,mount tmpfs tmpfs /sqlite_stmt_journals 4)设置一些文件的用户群组、权限 5)设置一些线程参数 6)设置TCP缓存大小

如何编译android userdata.img

tts in 1768. His father is said

Android OkHttp3 :最简单&粗暴(使用与原理)讲解

注释1:WebSocket是一个接口,它的实现类RealWebSocket,该类完成WebSocket的连接、数据请求与接收功能。 注释1:将RealCall实例添加至Dispatcher中(下文会介绍Dispatcher)。 注释2:通过getResponseWithInterceptorChain()获取响应。 注释3:通过封装好的拦截器集合,获取第一个拦截器的任务。 注释4:触发第一个拦截器的任务,该任务就触发一下拦截器的任务,以此类推,原理(Android事件传递机制)如下图: 注释1:把AsyncCall请求对象传递进Dispatcher线程池管理; 注释2:通过getResponseWithInterceptorChain()获取响应; 注释1:获取自定义线程池; 注释2:判断正在执行的异步请求数量与请求集合中相同host的数量是否满足,如果满足就添加到执行中的集合中,并添加至线程池中执行请求;如果不满足就添加至待执行请求的集合中,等待执行中的请求完成之后,再执行相同host数量判断满足才添加至线程池中执行请求; 注释3:将请求对象AsyncCall添加进请求执行的集合中; 注释4:将请求对象AsyncCall添加进线程池中执行; 注释5:当不满足执行条件时(注释2),把请求对象添加至待执行的集合中; 注释6:每当一个请求执行完毕时,就会调用finished()去掉对应集合中的存储对象,并在次判断待执行的集合中是否有满足条件的请求,若满足就添加至执行的集合与线程池中执行,若不满足继续等待下一个请求完成再次判断。 注释7:判断待执行的集合中是否满足可执行的对象。 2.RealConnection与HttpCodec初始化(RealConnection在ConnectInterceptor中通过StreamAllocation的newStream()初始化,而HttpCodec在RealConnection中被初始化)

android 中怎么找不到swiperefreshlayout这个类

SwiperefreshLayout在V4包中,如果找不到那就要更新一下SDK了,新版本的v4包中的。这是一个下拉刷新,上拉加载的示例代码。

Android-利用Jetpack-Compose-+Paging3+swiperefresh实现分页加载,下拉上拉效果

Paging是google官方推出的一个Android分页加载库,配合RecyclerView可以很方便实现RecyelerView的Footer和Header。可以使用在Java或Kotlin项目中,借助PagingDataAdapter帮助RecyclerView实现分页加载。 Paging中最重要的两个类是 PagingSource , LoadState 和 PagingDataAdapter : Jetpack Compose 提供了Flutter类似的功能API,非常方便,简单举个例子: 本文主要介绍JetCompose 项目中 Paging3分页的使用,下拉刷新上拉加载动效。效果如下: 构建错误:是com.google.accompanist:accompanist:xxx 相关库的版本不兼容,需要依赖相同的版本

android swiperefreshlayout怎么禁止下拉刷新

不要下拉刷新直接不用它不就完了、、、或者试试setEnabled(false

我用appium的swipe滑动Android的viewpager到最后一页再次滑动进入下一页无效,

您好:appiumdriver自带的swipe可以做到,appiumDriver.swipe(startX,startY,endX,endY,duration),至于你说的左右滑动,,只要Y轴不变,X轴变就可以了,详细可以看appiumdriverapi文档,,当然还有其他的类可以做到!

android studio 怎么读取gradle中的 applicationvariants

Gradle是可以用于Android开发的新一代的 Build System, 也是 Android Studio默认的build工具。Gradle脚本是基于一种JVM语言 -- Groovy,再加上DSL(领域特定语言)组成的。因为Groovy是JVM语言,所以可以使用大部分的Java语言库。所谓DSL就是专门针对Android开发的插件,比如标准Gradle之外的一些新的方法(Method)、闭包(Closure)等。由于Gradle的语法足够简洁,而且可以使用大部分的java包,当之无愧地成为新一代 Build System。使用Android Studio新建一个工程后,默认会生成两个build.gralde文件,一个位于工程根目录,一个位于app目录下。还有另外一个文件 --settings.gradle。根目录下的脚本文件是针对module的全局配置,它的作用阈所包含的所有 module 是通过settings.gradle来配置。app文件夹就是一个module,如果在当前工程中添加了一个新的module -- lib,就需要在settings.gralde文件中包含这个新的module

第一番 Android 不能进行debug调试

Error running app: (stackoverflow 还是相当靠谱的啊 ) 在面板中点击 Build Variants 找到想要debug的Model,将此Model后面Build Variants的 release 修改为debug ,等待重新build之后,就可以进行正常的debug了,如下图: (1) 如果在gradle中配置过渠道包,在Build Variants中会有很多选项,看一下正在使用的是否带有release后缀 如果有则选择相应的debug,如下图: (2) 如果在Android Studio 面板中没有 Build Variants 则按下面步骤进行,即可调出此面板,如下图: 若此文有幸被您看到,欢迎指正(づ ̄ 3 ̄)づ

android studio 怎么把 build variants显示出来

这个build variants可以点击build菜单,下面有对应的选项,show the variants好像是,点击就会有对应的窗口的

android有没有能播放rtmp流媒体的开源播放器代码

安卓设备上的播放——Vitamio安卓设备3.0以上原生支持hls,但是不支持rtmp,为了统一以及低版本兼容,可以使用第三方的一个播放器库——vitamio。hls播放如果仅需要在移动设备的WebView上播放,可以选择使用html中嵌入hls播放。如下html能够在所有Safari或者安卓3.0以上的WebView上播放。这样就不需要使用第三方的播放器。VideoJS如果要让网页支持在所有浏览器上播放,就需要使用第三方的播放器。VideoJs是一个较好的播放器库,完全免费,不像JWPlayer一样需要付费才能使用一些高级功能。

Android-LeakCanary原理解析

在分析LeakCanary原理之前,首先需要了解ReferenceQueue在LeakCanary的作用。 WeakReference在创建时,如果指定一个ReferenceQueue对象,在垃圾回收检测到被引用的对象的可达性更改后,垃圾回收器会将已注册的引用对象添加到ReferenceQueue对象中,等待ReferenceQueue处理。但是如果当GC过后引用对象仍然不被加入ReferenceQueue中,就可能存在内存泄露问题。这里ReferenceQueue对象中,存的其实就是WeakReference对象,而不是WeakReference中引用的要被回收的对象。即GC过后,WeakReference引用的对象被回收了,那么WeakReference引用的对象就是null,那么该WeakReference对象就会被加入到ReferenceQueue队列中。 所以我们可以通过监听 Activity.onDestroy() 回调之后,通过弱引用(WeakReference)对象、ReferenceQueue和 GC来观测Activity引用的内存泄露情况,如果发现了未被回收的Activity对象,在找到该Activity对象是否被其他对象所引用,如果被其他对象引用,就进行 heap dump生成完整的内存引用链(最短引用链),并通过notification等方式展示出来。 LeakCanary2.+的启动,与LeakCanary1.+的不同,1.+版本的启动,需要在Application的onCreate中手动调用LeakCanary.install方法进行启动;而2.+版本的启动则不需要,而是依赖ContentProvider,因为ContentProvider会在Application之前被加载,所以ContentProvider的onCreate方法会在Application的onCreate方法之前被调用,所以在ContentProvider的onCreate方法中完成初始化工作。 在源码中leakcanary-leaksentry中有一个LeakSentryInstaller,LeakSentryInstaller其实就是ContentProvider的一个子类,在其onCreate方法中就会调用InternalLeakSentry.install(application)进行初始化工作。 然后在AndroidManifest.xml中注册该ContentProvider。在这里注册,那么打包项目时,会将每个库和library中的AndroidManifest.xml合并到最终的app的androidManifest中。 LeakCanary的初始化是在InternalLeakSentry的install方法,即在ContentProvider的onCreate中调用。 这里的listener是LeakSentryListener接口,而实现LeakSentryListener接口的类,其实就是InternalLeakCanary,InternalLeakCanary是在leakcanary-android-core下的,InternalLeakCanary是单例模式的,采用的是kotlin单例,即用object关键字修饰类。 这里使用的RefWatcher对象,是在InternalLeakSentry中进行初始化的,然后在调用ActivityDestroyWatcher和FragmentDestroyWatcher的install方法的时候,传入。 在监测Activity和Fragment的生命周期进行内存回收以及是否泄露的过程,就是调用RefWatcher.watch方法进行,该方法是使用Synchronized修饰的同步方法。RefWatcher.watch的方法,一般是在Activity和Fragment生命周期执行到onDestroy的时候调用。根据生命周期监听触发回调,然后调用RefWatcher.watch方法。 VisibilityTracker其实就是在InternalLeakCanary.onLeakSentryInstalled方法中通过调用application.registerVisibilityListener方法的时候,添加的Application.ActivityLifecycleCallbacks,这里采用适配器模式,使用适配器模式的目的,其实就是不需要重写所有方法,只在VisibilityTracker中重写需要使用的方法。 VisibilityTracker的目的其实就是监听Activity的生命周期变化,即是否是执行到了onStart和onStop,如果是onStop的时候,则做内存泄露监测工作。 VisibilityTracker与ActivityDestroyWatcher有点区别,ActivityDestroyWatcher是最终Activity执行onDestroy的时候进行内存泄露分析 本方法是在InternalLeakCanary.onLeakSentryInstalled给application添加生命周期回调的时候,根据onStart和onStop生命周期的变化来进行Heap Dump(heap dump文件(.hprof)) 当生命周期执行到onStop的时候,会向该Application的扩展函数registerVisibilityListener的参数listener这个高阶函数传入boolean参数为false 看InternalLeakCanary#onLeakSentryInstalled方法中对application添加的生命周期监听,这是调用了application的扩展函数,该扩展函数是在VisibilityTracker中定义的。 其实registerVisibilityListener方法内部调用的就是application的registerActivityLifecycleCallbacks方法,传入的是Application.ActivityLifecycleCallbacks对象,这里传入的是VisibilityTracker,其实VisibilityTracker就是Application.ActivityLifecycleCallbacks的子类实现。 HeapDumpTrigger.onApplicationVisibilityChanged方法的调用,就是根据上述传给VisibilityTracker的listener函数来回调调用的,listener接收的是false的时候,就会调用scheduleRetainedInstanceCheck,接收的是false的时候是生命周期执行到onStop的时候。 这里的delayMillis默认是5s,因为该参数接收的是LeakSentry.config.watchDurationMillis,这个值初始默认值是5s。

android中能用menu菜单实现activity之间的跳转吗?

函数名字错了,//当客户点击菜单中的某个选项时,会调用改方法,点击的选项作为参数传进来public boolean onOptionsItemSelected(MenuItem item) 是这个函数;return super.onOptionsItemSelected(item);别的没啥错误;

android怎么控制选项菜单onCreateOptionsMenu的位置

1.Activity菜单机制 (与dialog类似)Activity有一套机制来实现对菜单的管理,方法如下:   1.public boolean onCreateOptionsMenu(Menu menu) 此方法用于初始化菜单,其中menu参数就是即将要显示的Menu实例。 返回true则显示该menu,false 则不显示; (只会在第一次初始化菜单时调用) 2.public boolean onPrepareOptionsMenu(Menu menu) 在onCreateOptionsMenu执行后,菜单被显示前调用;如果菜单已经被创建,则在菜单显示前被调用。 同样的, 返回true则显示该menu,false 则不显示; (可以通过此方法动态的改变菜单的状态,比如加载不同的菜单等) 3.public void onOptionsMenuClosed(Menu menu) 每次菜单被关闭时调用. (菜单被关闭有三种情形,menu按钮被再次点击、back按钮被点击或者用户选择了某一个菜单项) 4.public boolean onOptionsItemSelected(MenuItem item) 菜单项被点击时调用,也就是菜单项的监听方法。 通过这几个方法,可以得知,对于Activity,同一时间只能显示和监听一个Menu 对象。2. 添加菜单: 可以在onCreateOptionsMenu或者onPrepareOptionsMenu方法中来添加菜单 2.1代码添加: menu.add((int groupId, int itemId, int order, charsequence title) .setIcon(drawable ID) add()方法的四个参数,依次是: 1、组别,如果不分组的话就写Menu.NONE, 2、Id,这个很重要,Android根据这个Id来确定不同的菜单 3、顺序,哪个菜单项在前面由这个参数的大小决定 4、文本,菜单项的显示文本 add()方法返回的是MenuItem对象,调用其setIcon()方法,为相应MenuItem设置Icon 示例: public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(Menu.NONE, Menu.First+1, 0, "设置").setIcon(R.drawable.setting); return true; } 2.2布局文件添加: getMenuInflater().inflate(R.menu.options_menu, menu); 调用Activity的getMenuInflater()得到一个MenuInflater, 使用inflate方法来把布局文件中的定义的菜单 加载给 第二个参数所对应的menu对象 示例: @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.options_menu, menu); return true; } 布局文件: 在res目录下建立一个menu文件夹,并创建布局文件: options_menu.xml <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_setting" android:title="设置" android:icon="@drawable/setting"></item> </menu>

在android中写了一个menu,但是点击之后没有反应,求教了!

menu.add(2,MENU_COMMENT,MENU_COMMENT,"书评");其他修改类似

android怎么在系统app的菜单里面

连接不到app store是因app store 服务器是放到国外,所以服务器有问题,可以通过以下解决。1、在这里可以尝试把dns换成8.8.8.8 ,如在ios8设置桌面点击“设置”--“无线局域网”--“已连wifi后面的感叹号”--点击DNS,顺利打开AppStore。2、把时间设置到早些时候(20150124或更早)。3、使用VPN应用。

android固定底部菜单,可以在每个Activity中都能显示

用tabHost做

如何让android menu横向显示

你在布局里设置ScreenOrientation试试

我刚学Android不久,用系统自带的Menu,加了图片后怎么没显示出来

你把这些图标放到resource里面了吗?

android 怎么实现点击菜单在顶部和底部同时呼出不同的菜单选项?

猜测, 我没用过QQ浏览器。也没见过效果 在onkeydown里面 捕获菜单键。 你所说的搜索框 就弹出来。 而菜单就是正常出来。 搜索框 dialog 或是popupWindow 现在弄出来了没。 给分~~~ 哈哈

我刚学Android不久,用系统自带的Menu,加了图片后怎么没显示出来

你把这些图标放到resource里面了吗?

怎么让android系统中隐藏的menu按钮显示出来

菜单是用户界面中最常见的元素之一,使用非常频繁,在Android中,菜单被分为如下三种,选项菜单(OptionsMenu)、上下文菜单(ContextMenu)和子菜单(SubMenu),以下说的是创建OptionsMenu   一、概述 public boolean onCreateOptionsMenu(Menu menu):使用此方法调用OptionsMenu 。 public boolean onOptionsItemSelected(MenuItem item):选中菜单项后发生的动作。 public void onOptionsMenuClosed(Menu menu):菜单关闭后发生的动作。 public boolean onPrepareOptionsMenu(Menu menu):选项菜单显示之前onPrepareOptionsMenu方法会被调用,你可以用此方法来根据打当时的情况调整菜单。 public boolean onMenuOpened(int featureId, Menu menu):单打开后发生的动作。 二、默认样式   默认样式是在屏幕底部弹出一个菜单,这个菜单我们就叫他选项菜单OptionsMenu,一般情况下,选项菜单最多显示2排每排3个菜单项,这些菜单项有文字有图标,也被称作Icon Menus,如果多于6项,从第六项开始会被隐藏,在第六项会出现一个More里,点击More才出现第六项以及以后的菜单项,这些菜单项也被称作Expanded Menus。下面介绍。 1/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="请点击 Menu键显示选项菜单" android:id="@+id/TextView02" /> </LinearLayout>  2。重载onCreateOptionsMenu(Menu menu)方法   重载onCreateOptionsMenu(Menu menu)方法,并在此方法中添加菜单项,最后返回true,如果false,菜单则不会显示。 public boolean onCreateOptionsMenu(Menu menu) @Override public boolean onCreateOptionsMenu(Menu menu) { /* * * add()方法的四个参数,依次是: * * 1、组别,如果不分组的话就写Menu.NONE, * * 2、Id,这个很重要,Android根据这个Id来确定不同的菜单 * * 3、顺序,那个菜单现在在前面由这个参数的大小决定 * * 4、文本,菜单的显示文本 */ menu.add(Menu.NONE, Menu.FIRST + 1, 5, "删除").setIcon( android.R.drawable.ic_menu_delete); // setIcon()方法为菜单设置图标,这里使用的是系统自带的图标,同学们留意一下,以 // android.R开头的资源是系统提供的,我们自己提供的资源是以R开头的 menu.add(Menu.NONE, Menu.FIRST + 2, 2, "保存").setIcon( android.R.drawable.ic_menu_edit); menu.add(Menu.NONE, Menu.FIRST + 3, 6, "帮助").setIcon( android.R.drawable.ic_menu_help); menu.add(Menu.NONE, Menu.FIRST + 4, 1, "添加").setIcon( android.R.drawable.ic_menu_add); menu.add(Menu.NONE, Menu.FIRST + 5, 4, "详细").setIcon( android.R.drawable.ic_menu_info_details); menu.add(Menu.NONE, Menu.FIRST + 6, 3, "发送").setIcon( android.R.drawable.ic_menu_send); return true; } 3。为菜单项注册事件   使用onOptionsItemSelected(MenuItem item)方法为菜单项注册事件 public boolean onOptionsItemSelected(MenuItem item) @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case Menu.FIRST + 1: Toast.makeText(this, "删除菜单被点击了", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 2: Toast.makeText(this, "保存菜单被点击了", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 3: Toast.makeText(this, "帮助菜单被点击了", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 4: Toast.makeText(this, "添加菜单被点击了", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 5: Toast.makeText(this, "详细菜单被点击了", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 6: Toast.makeText(this, "发送菜单被点击了", Toast.LENGTH_LONG).show(); break; } return false; } 4.完整代码 package com.android.menu; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; public class DefaultMenu extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public boolean onCreateOptionsMenu(Menu menu) { /* * * add()方法的四个参数,依次是: * * 1、组别,如果不分组的话就写Menu.NONE, * * 2、Id,这个很重要,Android根据这个Id来确定不同的菜单 * * 3、顺序,那个菜单现在在前面由这个参数的大小决定 * * 4、文本,菜单的显示文本 */ menu.add(Menu.NONE, Menu.FIRST + 1, 5, "删除").setIcon( android.R.drawable.ic_menu_delete); // setIcon()方法为菜单设置图标,这里使用的是系统自带的图标,同学们留意一下,以 // android.R开头的资源是系统提供的,我们自己提供的资源是以R开头的 menu.add(Menu.NONE, Menu.FIRST + 2, 2, "保存").setIcon( android.R.drawable.ic_menu_edit); menu.add(Menu.NONE, Menu.FIRST + 3, 6, "帮助").setIcon( android.R.drawable.ic_menu_help); menu.add(Menu.NONE, Menu.FIRST + 4, 1, "添加").setIcon( android.R.drawable.ic_menu_add); menu.add(Menu.NONE, Menu.FIRST + 5, 4, "详细").setIcon( android.R.drawable.ic_menu_info_details); menu.add(Menu.NONE, Menu.FIRST + 6, 3, "发送").setIcon( android.R.drawable.ic_menu_send); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case Menu.FIRST + 1: Toast.makeText(this, "删除菜单被点击了", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 2: Toast.makeText(this, "保存菜单被点击了", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 3: Toast.makeText(this, "帮助菜单被点击了", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 4: Toast.makeText(this, "添加菜单被点击了", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 5: Toast.makeText(this, "详细菜单被点击了", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 6: Toast.makeText(this, "发送菜单被点击了", Toast.LENGTH_LONG).show(); break; } return false; } @Override public void onOptionsMenuClosed(Menu menu) { Toast.makeText(this, "选项菜单关闭了", Toast.LENGTH_LONG).show(); } @Override public boolean onPrepareOptionsMenu(Menu menu) { Toast.makeText(this, "选项菜单显示之前onPrepareOptionsMenu方法会被调用,你可以用此方法来根据打当时的情况调整菜单", Toast.LENGTH_LONG).show(); // 如果返回false,此方法就把用户点击menu的动作给消费了,onCreateOptionsMenu方法将不会被调用 return true; } } 5.运行效果

怎么让android系统中隐藏的menu按钮显示出来

菜单是用户界面中最常见的元素之一,使用非常频繁,在Android中,菜单被分为如下三种,选项菜单(OptionsMenu)、上下文菜单(ContextMenu)和子菜单(SubMenu),以下说的是创建OptionsMenu   一、概述 public boolean onCreateOptionsMenu(Menu menu):使用此方法调用OptionsMenu 。 public boolean onOptionsItemSelected(MenuItem item):选中菜单项后发生的动作。 public void onOptionsMenuClosed(Menu menu):菜单关闭后发生的动作。 public boolean onPrepareOptionsMenu(Menu menu):选项菜单显示之前onPrepareOptionsMenu方法会被调用,你可以用此方法来根据打当时的情况调整菜单。 public boolean onMenuOpened(int featureId, Menu menu):单打开后发生的动作。 二、默认样式   默认样式是在屏幕底部弹出一个菜单,这个菜单我们就叫他选项菜单OptionsMenu,一般情况下,选项菜单最多显示2排每排3个菜单项,这些菜单项有文字有图标,也被称作Icon Menus,如果多于6项,从第六项开始会被隐藏,在第六项会出现一个More里,点击More才出现第六项以及以后的菜单项,这些菜单项也被称作Expanded Menus。下面介绍。 1/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="请点击 Menu键显示选项菜单" android:id="@+id/TextView02" /> </LinearLayout>  2。重载onCreateOptionsMenu(Menu menu)方法   重载onCreateOptionsMenu(Menu menu)方法,并在此方法中添加菜单项,最后返回true,如果false,菜单则不会显示。 public boolean onCreateOptionsMenu(Menu menu) @Override public boolean onCreateOptionsMenu(Menu menu) { /* * * add()方法的四个参数,依次是: * * 1、组别,如果不分组的话就写Menu.NONE, * * 2、Id,这个很重要,Android根据这个Id来确定不同的菜单 * * 3、顺序,那个菜单现在在前面由这个参数的大小决定 * * 4、文本,菜单的显示文本 */ menu.add(Menu.NONE, Menu.FIRST + 1, 5, "删除").setIcon( android.R.drawable.ic_menu_delete); // setIcon()方法为菜单设置图标,这里使用的是系统自带的图标,同学们留意一下,以 // android.R开头的资源是系统提供的,我们自己提供的资源是以R开头的 menu.add(Menu.NONE, Menu.FIRST + 2, 2, "保存").setIcon( android.R.drawable.ic_menu_edit); menu.add(Menu.NONE, Menu.FIRST + 3, 6, "帮助").setIcon( android.R.drawable.ic_menu_help); menu.add(Menu.NONE, Menu.FIRST + 4, 1, "添加").setIcon( android.R.drawable.ic_menu_add); menu.add(Menu.NONE, Menu.FIRST + 5, 4, "详细").setIcon( android.R.drawable.ic_menu_info_details); menu.add(Menu.NONE, Menu.FIRST + 6, 3, "发送").setIcon( android.R.drawable.ic_menu_send); return true; } 3。为菜单项注册事件   使用onOptionsItemSelected(MenuItem item)方法为菜单项注册事件 public boolean onOptionsItemSelected(MenuItem item) @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case Menu.FIRST + 1: Toast.makeText(this, "删除菜单被点击了", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 2: Toast.makeText(this, "保存菜单被点击了", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 3: Toast.makeText(this, "帮助菜单被点击了", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 4: Toast.makeText(this, "添加菜单被点击了", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 5: Toast.makeText(this, "详细菜单被点击了", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 6: Toast.makeText(this, "发送菜单被点击了", Toast.LENGTH_LONG).show(); break; } return false; } 4.完整代码 package com.android.menu; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; public class DefaultMenu extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public boolean onCreateOptionsMenu(Menu menu) { /* * * add()方法的四个参数,依次是: * * 1、组别,如果不分组的话就写Menu.NONE, * * 2、Id,这个很重要,Android根据这个Id来确定不同的菜单 * * 3、顺序,那个菜单现在在前面由这个参数的大小决定 * * 4、文本,菜单的显示文本 */ menu.add(Menu.NONE, Menu.FIRST + 1, 5, "删除").setIcon( android.R.drawable.ic_menu_delete); // setIcon()方法为菜单设置图标,这里使用的是系统自带的图标,同学们留意一下,以 // android.R开头的资源是系统提供的,我们自己提供的资源是以R开头的 menu.add(Menu.NONE, Menu.FIRST + 2, 2, "保存").setIcon( android.R.drawable.ic_menu_edit); menu.add(Menu.NONE, Menu.FIRST + 3, 6, "帮助").setIcon( android.R.drawable.ic_menu_help); menu.add(Menu.NONE, Menu.FIRST + 4, 1, "添加").setIcon( android.R.drawable.ic_menu_add); menu.add(Menu.NONE, Menu.FIRST + 5, 4, "详细").setIcon( android.R.drawable.ic_menu_info_details); menu.add(Menu.NONE, Menu.FIRST + 6, 3, "发送").setIcon( android.R.drawable.ic_menu_send); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case Menu.FIRST + 1: Toast.makeText(this, "删除菜单被点击了", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 2: Toast.makeText(this, "保存菜单被点击了", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 3: Toast.makeText(this, "帮助菜单被点击了", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 4: Toast.makeText(this, "添加菜单被点击了", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 5: Toast.makeText(this, "详细菜单被点击了", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 6: Toast.makeText(this, "发送菜单被点击了", Toast.LENGTH_LONG).show(); break; } return false; } @Override public void onOptionsMenuClosed(Menu menu) { Toast.makeText(this, "选项菜单关闭了", Toast.LENGTH_LONG).show(); } @Override public boolean onPrepareOptionsMenu(Menu menu) { Toast.makeText(this, "选项菜单显示之前onPrepareOptionsMenu方法会被调用,你可以用此方法来根据打当时的情况调整菜单", Toast.LENGTH_LONG).show(); // 如果返回false,此方法就把用户点击menu的动作给消费了,onCreateOptionsMenu方法将不会被调用 return true; } } 5.运行效果

我想在android中设置两个下拉菜单

android 下拉菜单1.<?xml version="1.0" encoding="utf-8"?> 12.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 13. android:orientation="vertical" android:gravity="right" 14. android:layout_width="fill_parent" android:layout_height="fill_parent"> 15. 19. <FrameLayout android:layout_height="wrap_content" 20. android:layout_width="fill_parent"> 21. <TextView android:layout_width="wrap_content" 22. android:layout_height="wrap_content" android:text="FrameLayout"> 23. </TextView> 24. <TextView android:layout_width="wrap_content" 25. android:layout_height="wrap_content" android:text="Frame Layout"> 26. </TextView> 27. </FrameLayout> 28. 29. <TextView android:layout_width="wrap_content" 30. android:layout_height="wrap_content" android:text="@string/hello" /> 31. 39. <TableLayout android:id="@+id/TableLayout01" 40. android:layout_width="fill_parent" android:layout_height="wrap_content" 41. android:collapseColumns="1"> 42. <TableRow android:id="@+id/TableRow01" android:layout_width="fill_parent" 43. android:layout_height="wrap_content"> 44. <TextView android:layout_width="wrap_content" 45. android:layout_weight="1" android:layout_height="wrap_content" 46. android:text="行1列1" /> 47. <TextView android:layout_width="wrap_content" 48. android:layout_weight="1" android:layout_height="wrap_content" 49. android:text="行1列2" /> 50. <TextView android:layout_width="wrap_content" 51. android:layout_weight="1" android:layout_height="wrap_content" 52. android:text="行1列3" /> 53. </TableRow> 54. <TableRow android:id="@+id/TableRow01" android:layout_width="wrap_content" 55. android:layout_height="wrap_content"> 56. <TextView android:layout_width="wrap_content" 57. android:layout_height="wrap_content" android:text="行2列1" /> 58. </TableRow> 59. </TableLayout> 60. 66. <AbsoluteLayout android:layout_height="wrap_content" 67. android:layout_width="fill_parent"> 68. <TextView android:layout_width="wrap_content" 69. android:layout_height="wrap_content" android:text="AbsoluteLayout" 70. android:layout_x="100px" 71. android:layout_y="100px" /> 72. </AbsoluteLayout> 73. 81. <RelativeLayout android:id="@+id/RelativeLayout01" 82. android:layout_width="fill_parent" android:layout_height="fill_parent"> 83. <TextView android:layout_width="wrap_content" android:id="@+id/abc" 84. android:layout_height="wrap_content" android:text="centerInParent=true" 85. android:layout_centerInParent="true" /> 86. <TextView android:layout_width="wrap_content" 87. android:layout_height="wrap_content" android:text="marginLeft=20px" 88. android:layout_marginLeft="20px" /> 89. <TextView android:layout_width="wrap_content" 90. android:layout_height="wrap_content" android:text="xxx" 91. android:layout_below="@id/abc" android:layout_alignRight="@id/abc" /> 92. </RelativeLayout> 93. 94.</LinearLayout> 95. 96. 97.res/values/strings.xml 98.<?xml version="1.0" encoding="utf-8"?> 99.<resources> 100. <string name="hello">Hello Layout</string> 101. <string name="app_name">webabcd_layout</string> 102.</resources> 103. 104. 105.Main.java 106. 107.代码 108.package com.webabcd.layout; 109. 110.import android.app.Activity; 111.import android.os.Bundle; 112. 113.public class Main extends Activity { 114. /** Called when the activity is first created. */ 115. @Override 116. public void onCreate(Bundle savedInstanceState) { 117. super.onCreate(savedInstanceState); 118. setContentView(R.layout.main); 119. } 120.} 121. 122. 123.2、上下文菜单,选项菜单,子菜单 124.res/layout/main.xml 125. 126.代码 127.<?xml version="1.0" encoding="utf-8"?> 128.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 129. android:orientation="vertical" android:layout_width="fill_parent" 130. android:layout_height="fill_parent"> 131. 132. <TextView android:id="@+id/txt1" android:layout_width="fill_parent" 133. android:layout_height="wrap_content" android:text="@string/hello_contextMenu" /> 134. 135. <TextView android:id="@+id/txt2" android:layout_width="fill_parent" 136. android:layout_height="wrap_content" android:text="@string/hello_subMenu" /> 137. 138.</LinearLayout> 139. 140. 141.res/values/strings.xml 142. 143.代码 144.<?xml version="1.0" encoding="utf-8"?> 145.<resources> 146. <string name="hello_contextMenu">Hello Context Menu</string> 147. <string name="hello_subMenu">Hello Context Sub Menu</string> 148. <string name="app_name">webabcd_menu</string> 149.</resources> 150. 151. 152.Main.java 153. 154.代码 155.package com.webabcd.menu; 156. 157.import android.app.Activity; 158.import android.os.Bundle; 159.import android.view.ContextMenu; 160.import android.view.Menu; 161.import android.view.MenuItem; 162.import android.view.SubMenu; 163.import android.view.View; 164.import android.view.ContextMenu.ContextMenuInfo; 165.import android.widget.TextView; 166.import android.widget.Toast; 167. 168.// 演示两种菜单的实现方式:上下文菜单(通过在某元素上长按,来呼出菜单)和选项菜单(通过按手机上的菜单按钮,来呼出菜单) 169.public class Main extends Activity { 170. /** Called when the activity is first created. */ 171. @Override 172. public void onCreate(Bundle savedInstanceState) { 173. super.onCreate(savedInstanceState); 174. setContentView(R.layout.main); 175. 176. // 为 R.id.txt1 注册一个上下文菜单(在此 TextView 上长按,则会呼出上下文菜单) 177. // 具体呼出的菜单内容需要重写 onCreateContextMenu 来创建 178. TextView txt1 = (TextView) this.findViewById(R.id.txt1); 179. this.registerForContextMenu(txt1); 180. 181. // 为 R.id.txt2 注册一个上下文菜单 182. TextView txt2 = (TextView) this.findViewById(R.id.txt2); 183. this.registerForContextMenu(txt2); 184. } 185. 186. // 重写 onCreateContextMenu 用以创建上下文菜单 187. // 重写 onContextItemSelected 用以响应上下文菜单 188. @Override 189. public void onCreateContextMenu(ContextMenu menu, View v, 190. ContextMenuInfo menuInfo) { 191. super.onCreateContextMenu(menu, v, menuInfo); 192. 193. // 创建 R.id.txt1 的上下文菜单 194. if (v == (TextView) this.findViewById(R.id.txt1)) { 195. 196. // ContextMenu.setIcon() - 设置菜单的图标 197. // ContextMenu.setHeaderTitle() - 设置菜单的标题 198. menu.setHeaderIcon(R.drawable.icon01); 199. menu.setHeaderTitle("我是菜单"); 200. 201. // 用 ContextMenu.add() 来增加菜单项,返回值为 MenuItem 202. // 第一个参数:组ID 203. // 第二个参数:菜单项ID 204. // 第三个参数:顺序号 205. // 第四个参数:菜单项上显示的内容 206. menu.add(1, 0, 0, "菜单1"); 207. 208. // MenuItem - 新增菜单项后的返回类型,针对菜单项的其他设置在此对象上操作 209. menu.add(1, 1, 1, "菜单2").setCheckable(true); 210. 211. } 212. // 创建 R.id.txt2 的上下文菜单(多级上下文菜单) 213. else if (v == (TextView) this.findViewById(R.id.txt2)) { 214. 215. // ContextMenu.addSubMenu("菜单名称") - 用来添加子菜单。子菜单其实就是一个特殊的菜单 216. SubMenu sub = menu.addSubMenu("父菜单1"); 217. sub.setIcon(R.drawable.icon01); 218. sub.add(0, 0, 0, "菜单1"); 219. sub.add(0, 1, 1, "菜单2"); 220. sub.setGroupCheckable(1, true, true); 221. 222. SubMenu sub2 = menu.addSubMenu("父菜单2"); 223. sub2.setIcon(R.drawable.icon01); 224. sub2.add(1, 0, 0, "菜单3"); 225. sub2.add(1, 1, 1, "菜单4"); 226. sub2.setGroupCheckable(1, true, false); 227. 228. } 229. } 230. 231. 232. // 重写 onCreateOptionsMenu 用以创建选项菜单 233. @Override 234. public boolean onCreateOptionsMenu(Menu menu) { 235. 236. MenuItem menuItem = menu.add(0, 0, 0, "菜单111111111111111111111"); 237. 238. // MenuItem.setIcon() - 设置菜单项的图标 239. // MenuItem.setTitleCondensed() - 菜单的简标题,如果指定了简标题的话,菜单项上的标题将会以此简标题为准 240. // MenuItem.setAlphabeticShortcut() - 设置选中此菜单项的快捷键 241. // 注:菜单项超过 6 个的话,第 6 个菜单将会变为 More 菜单,多余的菜单会在单击 More 菜单之后显示出来 242. menuItem.setIcon(R.drawable.icon01); 243. menuItem.setTitleCondensed("菜单1"); 244. menuItem.setAlphabeticShortcut("a"); 245. 246. menu.add(0, 1, 1, "菜单2").setIcon(R.drawable.icon02); 247. menu.add(0, 2, 2, "菜单3").setIcon(R.drawable.icon03); 248. menu.add(0, 3, 3, "菜单4"); 249. menu.add(0, 4, 4, "菜单5"); 250. menu.add(0, 5, 5, "菜单6"); 251. menu.add(0, 6, 6, "菜单7").setIcon(R.drawable.icon04); 252. menu.add(0, 7, 7, "菜单8").setIcon(R.drawable.icon05); 253. 254. return true; 255. } 256. 257. // 重写 onOptionsItemSelected 用以响应选项菜单 258. @Override 259. public boolean onOptionsItemSelected(MenuItem item) { 260. super.onOptionsItemSelected(item); 261. 262. Toast.makeText(Main.this, "被单击的菜单项为:" + String.valueOf(item.getItemId()), Toast.LENGTH_SHORT).show(); 263. 264. return false; 265. } 266.}

android中怎么让menu菜单显示在屏幕左上角

  用惯了Android的人在刚拿到iPhone的时候,总是会习惯性的用手指从状态栏往下拖一下,这都是给Notification闹的。不过Notification也确实是1个不错的提示工具,不干扰正常的操作,事后还可以再翻看详细的内容,点击后还可以进入相关的画面查看更具体的内容。今天我就以代码为主的形式来介绍Notification的使用,包括基本用法,自定义的View,以及更多的控制方法。另一种Android中常用到的提示方法Toast的用法请参见《教程:在Android中使用Toast进行提示》我们先看下Notification的几个主要组成部分:Icon:不解释Ticker Text:Notification刚出来的时候,在状态栏上滚动的字幕,如果很长,会自动分割滚动Content Title:Notification展开后的标题Content Text:Notification展开后的内容Notification的一般用法取得NotificationManager  private NotificationManager mNotificationManager;mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);创建Notification并且显示  //Notification的滚动提示String tickerText = "My notification, It"s a long text! Hello World desiyo?";//Notification的图标,一般不要用彩色的int icon = R.drawable.icon_02241_3; //contentTitle和contentText都是标准的Notification View的内容//Notification的内容标题,拖下来后看到的标题String contentTitle="My notification";//Notification的内容String contentText="Hello World!"; //Notification的Intent,即点击后转向的ActivityIntent notificationIntent = new Intent(this, this.getClass());notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); //创建NotifcationNotification notification = new Notification(icon, tickerText, System.currentTimeMillis());//设定Notification出现时的声音,一般不建议自定义notification.defaults |= Notification.DEFAULT_SOUND;//设定如何振动notification.defaults |= Notification.DEFAULT_VIBRATE;//指定Flag,Notification.FLAG_AUTO_CANCEL意指点击这个Notification后,立刻取消自身//这符合一般的Notification的运作规范notification.flags|=Notification.FLAG_AUTO_CANCEL;notification.setLatestEventInfo(this, contentTitle, contentText, contentIntent);//显示这个notificationmNotificationManager.notify(HELLO_ID, notification);这是最基本的应用,可以说除了找个合适的图标以外,其它都很简单。使用自定义View的Notification同Toast一样,我们也可以自已指定1个View来作为Notification展开后的显示内容,比如说在Android Market中下载的时候,Notification中会显示当前下载的进度,那么我们也来模拟1个这样的效果吧。首先给出View的定义文件:notification_view_sample.xml  <?xml version="1.0" encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:padding="3dp"><ImageView android:id="@+id/notificationImage"android:layout_width="wrap_content" android:layout_height="wrap_content"android:src="@android:drawable/stat_sys_download"/><TextView android:id="@+id/notificationTitle"android:layout_width="wrap_content" android:layout_height="wrap_content"android:layout_toRightOf="@id/notificationImage"android:layout_alignParentRight="true"android:paddingLeft="6dp"android:textColor="#FF000000"/><TextView android:id="@+id/notificationPercent"android:layout_width="wrap_content" android:layout_height="wrap_content"android:layout_below="@id/notificationImage"android:paddingTop="2dp"android:textColor="#FF000000"/><ProgressBar android:id="@+id/notificationProgress"android:layout_width="wrap_content" android:layout_height="wrap_content"android:layout_below="@id/notificationTitle"android:layout_alignLeft="@id/notificationTitle"android:layout_alignParentRight="true"android:layout_alignTop="@id/notificationPercent"android:paddingLeft="6dp"android:paddingRight="3dp"android:paddingTop="2dp"style="?android:attr/progressBarStyleHorizontal"/></RelativeLayout>RelativeLayout的使用,可以参考:《教程:Android各种Layout特性和使用汇总(一)》

为什么在android中Menu不显示??

public boolean onCreateOptionsMenu(Menu menu){ super.onPrepareOptionsMenu(menu); menu.clear(); MenuInflater inflater=getMenuInflater(); inflater.inflate(R.menu.menu, menu); return true; }把onCreateOptionsMenu()方法改成这样试试

Android 中MenuItem 怎么传递参数

应该是可以识别的吧,你定义的result是个成员变量来的,内部类是可以访问外部类的成员变量的啊,除非你的内部类是在一个方法里,而要访问的变量是方法的局部变量。 如果是这样,内部类是只能访问方法中的final变量的,因为如果这个方法栈结束了,result这个变量肯定会消失,可是内部类还可能存在在堆中,因为可能没那么快被回收,这个时候,也就是说它有可能会去访问一个变量result,可是这个变量result却是早已经被清除了的,这是肯定不行的。 所以,要么把result定义成final的。

android menu 怎么得到item

@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.myinfo, menu); }@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { // 搜索 case R.id.info_search:根据ID

android里面的SPL是什么?

SPL全称“Secondary Program Loader”,中文名叫做二次程序载入器,负责检测ROM和硬件,寻找系统启动分区并装载ROM的其它部分。简单来说,就是俗称的刷机安全套件,保证您在刷机失败时也不会变砖头,通常可分为“Hard-SPL”和“Soft-SPL”两种。破解手机也就是破解的这个部分。摩托罗拉DEXT最新的Android机器功能上比较全面,外观形象美观,设计轻巧便于日常携带,而且售价也非常低廉。性价比不错。

android里面的SPL是什么?求解答

SPL全称“Secondary Program Loader”,中文名叫做二次程序载入器,负责检测ROM和硬件,寻找系统启动分区并装载ROM的其它部分。简单来说,就是俗称的刷机安全套件,保证您在刷机失败时也不会变砖头,通常可分为“Hard-SPL”和“Soft-SPL”两种。破解手机也就是破解的这个部分。摩托罗拉DEXT最新的Android机器功能上比较全面,外观形象美观,设计轻巧便于日常携带,而且售价也非常低廉。性价比不错。

android如何显示多个View

如果很平常的两个listview组件竖直放在linearLayout布局中,结果是:两个listview 很独立,中间似乎有个分割线,完全吧他们分离了,各自独立滚动,如果上面的listview把整个屏幕占据了,那么下面的listview永远滚不上来了,看不到了。网上关于这个话题大约有两种方法解决:(1)有多少个listview就用多少个listview组件,然后放在一个LinearLayout布局里面,linearLayout布局在放入Scrollview中。这样做,必须先计算出每个listview被对应的adapter适配之后的实际高度,然后设置listview为这个高度。再放入scrollview中ok了。(2)不管有多少个listview,都放在一个listview,用一个adapter适配,在listview组件对应的数据存储结构list中,设置flag标志位,在adapter中再对不同的flag做不同的适配。一开始,项目中使用的第一种方法,随着项目的进行,发现第一种方法会在很多种情况下不适应,最严重的问题,就是第一种方法非常耗时,已经到了一种无可忍受的地步了。一个很常见的例子,城市列表,有两个list:热门城市、全部城市假如用第一种方法,先计算两个listview在对应的adapter适配后的高度:[java] view plaincopypublic static void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } int totalHeight = 0; for (int i = 0; i < listAdapter.getCount(); i++) { View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); listView.setLayoutParams(params); } [java] view plaincopypublic static void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } int totalHeight = 0; for (int i = 0; i < listAdapter.getCount(); i++) { View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); listView.setLayoutParams(params); } 其实从这段代码中,和上面这个需求,问题已经可以看出来了。adapter有一个方法getView,这个方法是如果这个listview的某行将要在屏幕上显示了,系统就会自动调用getview得到这个布局,然后显示。也就是每次被调用的次数,只是屏幕上能显示的条数,最多也就是10条左右。而一次计算高度就要对每一条调用getview,for循环里面:[java] view plaincopyView listItem = listAdapter.getView(i, null, listView); [java] view plaincopyView listItem = listAdapter.getView(i, null, listView); 是非常耗时的,尤其对于全部城市,几百条,3~4秒肯定是要的。所以面对这个需求,第一种方法是不可行。除了耗时,第一种方法,维护性也不好。就比如,一个页面中,listview的数据是不定的,是动态计算得到的。用第一种方法分散到多个listview,对于一些事件监听,不好操作。下面讲解下第二种方法的具体实现拿上面城市列表具体分两块:1、数据dataList2、adapter1、datalist填充:主要以一个flag标记,对于城市列表共有两种布局:一个是头信息一个是具体的城市代码:[java] view plaincopycityList.clear(); Map<String, Object> map1 = new HashMap<String, Object>(); map1.put("city", new City(0, "热门城市", "#")); cityList.add(map1); List<City> cities = getHotCity(); for (City city : cities) { Map<String, Object> map = new HashMap<String, Object>(); map.put("is_selected", false); map.put("city", city); cityList.add(map); } Map<String, Object> map2 = new HashMap<String, Object>(); map2.put("city", new City(0, "全部城市", "$")); cityList.add(map2); index++; cities = getAllCity(); for (City city : cities) { Map<String, Object> map = new HashMap<String, Object>(); map.put("is_selected", false); map.put("city", city); cityList.add(map); } [java] view plaincopycityList.clear(); Map<String, Object> map1 = new HashMap<String, Object>(); map1.put("city", new City(0, "热门城市", "#")); cityList.add(map1); List<City> cities = getHotCity(); for (City city : cities) { Map<String, Object> map = new HashMap<String, Object>(); map.put("is_selected", false); map.put("city", city); cityList.add(map); } Map<String, Object> map2 = new HashMap<String, Object>(); map2.put("city", new City(0, "全部城市", "$")); cityList.add(map2); index++; cities = getAllCity(); for (City city : cities) { Map<String, Object> map = new HashMap<String, Object>(); map.put("is_selected", false); map.put("city", city); cityList.add(map); } 哦~这个好像没用到flag标记,直接判断city的name了~~~2、adapter适配:[java] view plaincopy@Override public View getView(final int position, View convertView, ViewGroup parent) { City city = (City) listData.get(position).get("city"); String nameString = city.getName(); if (nameString.compareTo("热门城市") == 0) { convertView = mInflater.inflate(headResource, null); ((TextView) convertView.findViewById(R.id.label)).setText("热门城市"); return convertView; } if (nameString.compareTo("全部城市") == 0) { convertView = mInflater.inflate(headResource, null); ((TextView) convertView.findViewById(R.id.label)).setText("全部城市"); return convertView; } convertView = mInflater.inflate(listResource, null); ((TextView) convertView.findViewById(R.id.label)).setText(nameString); ImageView isSelectedImageView = (ImageView) convertView.findViewById(R.id.is_selected); // boolean isSelected = (Boolean) listData.get(position).get("is_selected"); int whichIsSelected = (Integer) listData.get(getCount() - 1).get("which_is_selected"); if (city.getId() == whichIsSelected) isSelectedImageView.setBackgroundResource(R.drawable.is_selected_yes); else isSelectedImageView.setBackgroundResource(R.drawable.is_selected_no); return convertView; } [java] view plaincopy@Override public View getView(final int position, View convertView, ViewGroup parent) { City city = (City) listData.get(position).get("city"); String nameString = city.getName(); if (nameString.compareTo("热门城市") == 0) { convertView = mInflater.inflate(headResource, null); ((TextView) convertView.findViewById(R.id.label)).setText("热门城市"); return convertView; } if (nameString.compareTo("全部城市") == 0) { convertView = mInflater.inflate(headResource, null); ((TextView) convertView.findViewById(R.id.label)).setText("全部城市"); return convertView; } convertView = mInflater.inflate(listResource, null); ((TextView) convertView.findViewById(R.id.label)).setText(nameString); ImageView isSelectedImageView = (ImageView) convertView.findViewById(R.id.is_selected); // boolean isSelected = (Boolean) listData.get(position).get("is_selected"); int whichIsSelected = (Integer) listData.get(getCount() - 1).get("which_is_selected"); if (city.getId() == whichIsSelected) isSelectedImageView.setBackgroundResource(R.drawable.is_selected_yes); else isSelectedImageView.setBackgroundResource(R.drawable.is_selected_no); return convertView; } 对于各行的点击操作也可以根据flag统一处理。维护起来非常方便。

android studio git解决冲突吗

在使用git pull代码时,经常会碰到有冲突的情况,提示如下信息:error: Your local changes to "c/environ.c" would be overwritten by merge. Aborting.Please, commit your changes or stash them before you can merge.这个意思是说更新下来的内容和本地修改的内容有冲突,先提交你的改变或者先将本地修改暂时存储起来。处理的方式非常简单,主要是使用git stash命令进行处理,分成以下几个步骤进行处理。1、先将本地修改存储起来$ git stash这样本地的所有修改就都被暂时存储起来 。是用git stash list可以看到保存的信息:git stash暂存修改其中stash@{0}就是刚才保存的标记。2、pull内容暂存了本地修改之后,就可以pull了。$ git pull3、还原暂存的内容$ git stash pop stash@{0}系统提示如下类似的信息:Auto-merging c/environ.cCONFLICT (content): Merge conflict in c/environ.c意思就是系统自动合并修改的内容,但是其中有冲突,需要解决其中的冲突。4、解决文件中冲突的的部分打开冲突的文件,会看到类似如下的内容:git冲突内容其中Updated upstream 和=====之间的内容就是pull下来的内容,====和stashed changes之间的内容就是本地修改的内容。碰到这种情况,git也不知道哪行内容是需要的,所以要自行确定需要的内容。解决完成之后,就可以正常的提交了。

android手机如何运行网络Ping测试?

android手机运行网络Ping测试的方法大致分为两种:一种是系统自带的测试功能,里面包含有ping测试的网络功能。另外一种是下载第三方APP应用来进行相关的PING测试。方法一:系统自带的手机测试功能。在拨号界面上输入:*#*#4636#*#* ,手机自动进入测试模式。选择“手机信息”可以看到“运行ping测试”点击即可ping谷歌的服务器。方法二:直接下载安装第三方测试应用,应用的名字就叫PING。应用默认ping的是百度的IP地址,你也可以自己修改ip,应用界面如图。扩展资料Ping是Windows、Unix和Linux系统下的一个命令。ping也属于一个通信协议,是TCP/IP协议的一部分。利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障。应用格式:Ping空格IP地址。该命令还可以加许多参数使用,具体是键入Ping按回车即可看到详细说明。参考资料:百度百科-Ping

android (安卓)是完全开源的吗?

android (安卓)是完全开源的吗? otyh53 spring 是完全开源的吗 先说方法,后说结果。 讨论3个问题,1怎么确定是不是开源软体? 2.如果是开源软体,用的时候是不是可以为所欲为? 3. 答题主的问题。 问题1--->>>> 要判断一个软体是否开源,一般的流程是: (1)去官网看文件里面有没有提到说是开源软体。一般如果开源,会在文件里很明显的写明open source字样,因为开源对于软体来说是一个极大的优势。 (2)检视是基于什么开源协议,开启软体的安装包,解压之后在安装包的目录下能比较容易的找到license.txt档案,开启之后就可以找到是基于什么开源协议了。 一般常用的开源协议有 Apache License(现在是2.0版本了),比较有代表性的软体有, Apache系列的开源软体,如,Structs,还有阿里巴巴的Druid等。 其它的开源协议,还有Linux用的GPL,然后 MySQL据说是GPL 2.0的,我基本不用MySQL,所以没有下安装包看具体东西。另外还有BSD、MIT, LGPL等50多种开源协议。 问题2--->>>> 如果是开源软体,拿到软体之后是不是可以为所欲为了呢,答案是否定的。 要去看开源协议是怎么要求的,不同的开源协议有不同的要求。举个栗子,Linux使用的是GPL开源协议,根据GPL协议的要求,只要你的软体用了Linux,就得开源,而且必须继续使用GPL协议开源,so,后面的继续开源。这叫做GPL的”传染性“。so,很多很多开源的Linux软体,此处应该有个笑cry的表情吧。(MySQL使用的是这个协议的2.0版本,但是我没调查清楚,这里也不乱说了) Apache协议得要求就相对宽松了,允许作为第三方包引用,允许修改原始码,允许在原始码的基础上发挥(做一个新产品出来),但是你释出为商业软体或者开源软体的时候,license档案的写法是有具体规定的。戳这里能看到到底咋做才行:apache./licenses/LICENSE-2.0(ps:网上搜到的很多不可靠,so我打算近期把这个翻译一下,如果翻译了,我会在这里贴上我的部落格地址) 问题3--->>>> 关于题主的Spring,由于Spring现在有很多产品,so,这里预设国内web专案最常用的 Spring Framwork。 由于我本人近期很少做Java web专案,所以环境中并没有从官网上下载的Spring的发行包。去官网检视之后,发现现在基本是Maven和Gradle的天下了(原来我还活在原始社会,来一个cry笑的表情吧)。然后在:olex.openlogic./packages/spring/下载了一个spring 按照上面的步骤,我去这里下载了Spring的发行包,解压之后,里面赫然躺着license.txt档案,开启之,赫然发现了Apache License Version 2.0, January 2004这个字样。 (这块有比较全的开源协议解释,不过是英文的:olex.openlogic./licenses) 还有两个窟窿没堵上,有兴趣并且有才的同志可以接着回答: 这里为啥是 January 2004?2. 如果用了Maven和Gradle怎么判断开源协议的版本? 总结一下吧,判断所要引用(或修改或扩充套件)的第三方软体是否开源,首先这是架构师的事情,因为架构师要决定使用哪种技术。然后这是产品经理的事情(ps:我现在任职的公司,产品的license档案是由产品经理提供(写)的)。 当然所要使用的技术在前期进行可行性分析和技术论证的时候,基本已经确定了。So,对于一个编码人员,是不需要管这些东西的,只需要用某种产品,出了版权纠纷(传闻国外有因为开源问题打过官司的案例),也不是咱的事情。但是话说回来,保不准哪天有个机会爬一个台阶呢,我只是想说,机会是留给有准备的人的。(罗嗦了,不要打我,再来一个笑cry) MFC是完全开源的吗 MFC是个类库,你让他怎么开源? 开源是相对于程式,比如MFC开发的一个程式,我们可以说这个程式是不是开源的。 ubuntu是完全开源的么? 官网有下载 javashop是完全开源还是部分开源? 开源程度很高,可以做底层开发,不会有问题,而且成本低,可以选择 phpBB是不是完全开源的? phpbb是完全开源的,可以任意修改,甚至去掉版本号以及所有著作人相关资讯,DISCUZ只是开放原始码而已,对于商业用途还是要收费的,不能任意修改,也不能去掉所有的DISCUZ相关连结和版权资讯,所以DISCUZ并不是开源 只是公开原始码而已 xiao7china.是用 phpbb修改的仿DISCUZ风格的论坛,嘿嘿,是我滴 shopnc 2014 是不是完全开源的? 网上找来的全是盗版的,2014年4月左右流出的版本,以后发现的一些bug官方都提供过N个补丁包了,但是盗版的是不会给你补丁的。学习还行,真正运营还是找官方吧。 小米是的作业系统是完全开源的吗 是的,小米系统也是安卓改良UI介面得来的产物 ffmpeg 程式码是不是完全开源 是的 本开原始码播放器使用的音视讯解码程式码来源于ffmpeg-0.6.3(:ffmpeg.), jni衔接程式码和java层程式码来源于havlenapetr(:github./havlenapetr/FFMpeg)。 移植ffmpeg到android的常规关键点网上有很多的帖子可以参考,也可以用资料夹比较工具比较一下,看看新增修改删除了那些档案。 本开原始码的编译环境 1: Android SDK 2.2版, 2: NDK r4版,注意要汇出NDK巨集, 3: IDE开发环境是 eclips 3.5 版 4: libffplay.so是在Android 2.2版原始码目录树中编译出来的,使用Ubuntu10.04和VMware7.1.1版,目前原始码不公开 5: libffmpeg.so编译步骤,cd /cygwin/c/ffplay, ./config_r4.sh, $NDK/ndk-build 6: PC主机开发环境是windows xp。 特别注意,此demo只能在 Android SDK 2.2版上使用,其他版本有修改原始码,重新编译才行。 此开原始码解决了几个特别关键点,达到实用水平。几个关键点如下: 1:arm汇编程式码编译支援,主要是在几个.mk档案中新增LOCAL_ARM_MODE := arm语句, 在config_r4.sh档案中新增--arch=armv5te和--enable-a *** 等开关。 2:在ffmpeg config_r4.sh配置档案中关闭了一些不用的选项后,连线时总是报一些莫名其妙的连线错误, 本开原始码给出终极解决方案(在/jni/jni/Android.mk档案中新增 LOCAL_LDLIBS += C:/ffplay/bin/ndk/local/armeabi/libavcodec.a等语句)。 3:修改havlenapetr中的视讯显示错误bug,经测试havlenapetr原始程式码在模拟器设定为320x480时显示正确,在更大的解析度下显示错误, 本开原始码已修改好此bug,现在无论什么解析度都可以正确显示。 此开原始码其他注意事项: 1:jni衔接程式码相比havlenapetr精简了几个数量级,更方便网友们研习。 2:此开原始码不包括play,pause,s,seek和视音讯同步等功能实现程式码,这部分程式码不开源。 3:Android jni层直接输出音讯示例,Android jni层直接输出视讯示例,基于ffmpeg的Android播放器开原始码,三个工程使用相同的库,相同的方法和技巧,可相互参考。 在moto defy me525上测试通过。 动易的SiteFactory2.0是否是完全开源 核心程式没有完全开源,但是动易SF的模型和标签灵活性,足以让使用者进行二次开发,只要稍懂SQL和XML,就能写出各种功能的标签,来实现目前比较流行的功能.如果想用它做站,不需要考虑原始码是不是完全公开,因为一般人不可能对一个程式的核心程式进行完全的改写.没有那个精力也没有那个必要. 想用SF建站,欢迎常来CMS联盟交流讨论:cmsw3c.我们这里有动易及各种CMS的教程.及FANS.爱好者们热情及乐于助人.是一个很好的学习交流的场所.

Tangram系列(一)Android Tangram入门

Tangram基本理念是 粗颗粒度组件化+灵活布局容器 ,重点关注 高性能 (页面渲染效率&组件回收复用,跨父节点组件的高效回收与复用); 面向业务 (组件业务化、动态化,通过布局+组件的形式搭建整个页面,而不是从基本的UI元素搭建页面); 多终端一致性 (一个json描述的布局可以同时在iOS端与Android端使用,且表现一致)。 整体页面由卡片组成,卡片由组件组成。在Tangram中 组件模型 是抽象出的最小的可复用单元,承载业务逻辑和UI展示,以尽可能小的业务单元为颗粒度,而 卡片模型 负责逻辑,粗颗粒化,不提供布局细节描述,只声明布局方式。 本篇会从Tangram布局框架VLayout(Android)、VirtualView初探两方面来进行初步的介绍。 针对需要在长列表下做各种形态来分配不同元素的电商页首页,传统的复用容器(ListView或RecyclerView)会出现复用性降低以及需要处理嵌套滑动的情况,所以VLayout提供了一个基于RecyclerView的自定义LayoutManger,可以实现不同布局格式混排。 RecyclerView 中正常只有一种布局,如果列表需要使用不同的布局,可以通过设置不同的ItemType,提供多种ViewHolder实现。而VLayout使用了不同的思路,其Adapter是串联自多个继承RecyclerView.Adapter的Adapter来管理视图的适配和数据,同时实现缓存。 VLayout中具体布局逻辑在 LayoutHelper 中实现,每个Adapter和LayoutHelper负责一个区域范围内的组件,不同范围内的组件之间如果类型相同,可以在滑动过程中回收复用。 LayoutHelper包含了它负责的组件的 位置 起始区域,它们会被传递给自定义的LayoutManager。当RecyclerView开始渲染页面或者滑动时,它内部维护了一个布局状态,获取当前屏幕范围内还有多少区域是空白的,下一个要加载的View的位置是多少,然后把这些信息告诉LayoutManager去加载View做布局。我们然后交给LayoutHelper去布局,不同的LayoutHelper会按照约定的协议进行进一的自定义LayoutManager拿到这个位置之后,就反向查找对应的LayoutHelper去布局。 VirtualView抽象&封装了Canvas绘制视图流程,通过使用Canvas来实现UI控件的绘制,虚拟化就是实现依赖于宿主容器而没有实际View(不同于常见的Button、TextView)。通过XML引用绘制好的UI组件,从而创建出界面模板,客户端通过解析和加载XML界面模板最终渲染出界面。 不论是虚拟化组件还是原生组件,都要经过计算尺寸阶段、布局阶段、绘制阶段来定义,再加上相同的尺寸计算接口、布局接口、绘制接口,这样对于宿主容器来说,包装在内部的组件就不分虚拟化还是原生,一视同仁,暴露给外面的接口也是一样的,只要将宿主容器像普通的 View 一样添加到的视图界面上,就可以在后续的渲染过程中显示出来。如果虚拟组件使用的越多,View 的个数就越少,对于系统来说层级越扁平。以示例的组件来说,最终呈现的 View 只有宿主容器和两个图片组件,如果将图片也用虚拟化的方式实现,最终 View 只有一个宿主容器,而界面仍然保持不变。 优化问题 1.动态更新UI组件:实现了模板与数据分离,使用XML描述视图然后在 端上绑定动态下发的界面模板&数据,最终渲染。 2.提高性能:通过使用Canvas绘制减少视图的层级和个数来提高布局加载 效率。 特点 1.渲染性能高:渲染出来的视图结构呈现扁平化; 2.组件热更新:通过配套XML模板更新sdk; 3.跨平台:一套XML模板,可以Android、iOS通用; 4.兼容性好:支持加载&渲染原生基础组件; 5.使用方便:内置一系列基础组件可以直接使用。 在Tangram里使用VirtualView的时候,很多步骤已经内置到 Tangram 的初始化里了,外部只需要注册业务组件类型、加载模板数据、提供事件处理器。 基本布局描术文件是一个XML文件,并附带一个json数据文件,其中的相关数据来源都可以从数据json文件中使用表达式获取。一个XML就是一个组件,Tangram通过加载这个XML文件即可使用该XML文件所描述的组件,从而实现了动态新增组件类型的功能。 https://github.com/alibaba/tangram-android https://www.sohu.com/a/122226581_505818 https://www.jianshu.com/p/48764ff8449f https://www.jianshu.com/p/cd634106f533 http://pingguohe.net/2017/02/28/vlayout-design.html

Tangram系列(二)Android Tangram 整体介绍

Tangram可适用于电商首页、内容推荐页等类型的页面,具有以下特点: 以千千音乐首页为例: 根据上图我们先统一两个概念: 布局:从业务看,一个红框是一组同类型的内容。从技术上看,一个红框就是一个布局。本文中提到的“红框”可以等同布局理解。 组件:从业务看,一个绿框是一个业务内容单元展示,从技术上看,一个绿框就是一个组件,对应就是RecyclerView的一个item。 Tangram设计思想: Vlayout本身是一个单独的框架,是对RecyclerView的布局能力的加强版,提供了支持上图中不同布局样式的布局能力。一个布局会有一个LayoutHelper类去负责完成布局能力的实现。 VirtualView本身是一个单独的框架,提供一套自定义View,和一般View一样可以在布局页面时使用。并且提供了View的动态化和虚拟化,虚拟化是可以简单理解为页面绘制渲染是简化View树来优化性能的。动态化,是指一个或者一组View,可以通过服务端下发给客户端去动态展示,而这里说的一个或者一组View,就可以理解为Tangram的一个组件的。也就是Tangram是使用VirtualView实现了组件的动态化。 Tangram核心框架实现整个框架的初始化、流程控制、业务数据和动态布局的组合等功能。其实可以简单理解为,就是对Vlayout和VirtualView的完整的封装。 RecyclerView自定义的ViewGroup,绘制流程肯定还是基于原生流程的onMeasure、layout、draw三大绘制流程,但是基于这三大流程进行了功能扩展。 测量和布局流程 需要强调一点的是,RecyclerView是一个布局比较复杂的View,绘制流程已经打破了onMeasure负责测量,layout负责布局的明显划分。而是根据功能需要封装了一下三个布局步骤: 为什么说绘制流程打破了onMeasure负责测量,layout负责布局的流程划分?例如在RecyclerView的一般绘制流程中,dispatchLayoutStep2会在onMeasure调用,已经就完成了itemview的测量和布局流程。 那这三个布局步骤的调用流程是怎么控制的?首先三个布局流程还是基于onMeasure、layout中调用,不过调用流程是根据RecyclerView的当前状态决定调用哪一步,RecyclerView有三种状态,来控制三个布局步骤的调用时机。 绘制流程 draw流程相对简单,就是根据需要完成对应的内容绘制,主要做了四件事: fill方法就是RecyclerView的完成itemview布局的地方,而Vlayout就是以这个里为切入点,自定义了LayoutManager将布局能力委托给了LayoutHelper完成。也就是,我们想自己定义一种特定的布局样式,就是要自定义一个LayoutHelper。 以上说的流程是一般流程,实际流程要复杂很多,这里给大家补充说明一点:对于一个绘制完的RecyclerView,屏幕上的itemView不是每次都全部remove再添加的。例如滑动时候,并没有调用到onLayoutChildren,而是通过调用itemview的offsetTopAndBottom方法实现滑动。 但是当有新的itemview滑出时,onLayoutChildren会被调用,remove所有的itemView,fill方法进行itemView的填充。 本文主要整体介绍了Tangram三大组成部分以及其作用,RecyclerView的绘制流程。都是结论性的总结说明,为之后的各模块的详细分析,提供一个概念的说明,有利于大家整体上把握Tangram框架。如有理解不当之处欢迎指正。

android 电容屏

一、电容屏工作原理 触摸屏的工作原理概括来说就是上报坐标值,X轴、Y轴的值。前面我们分析了电阻触摸屏,它是通过ADC来检测计算X、Y轴坐标值,下面我们分析一下电容触摸屏的工作原理,看它是如何去检测计算X、Y坐标的值。与电阻式触摸屏不同,电容式触摸屏不依靠手指按力创造、改变电压值来检测坐标的。电容屏通过任何持有电荷的物体包括人体皮肤工作。(人体所带的电荷)电容式触摸屏是由诸如合金或是铟锡氧化物(ITO)这样的材料构成,电荷存储在一根根比头发还要细的微型静电网中。当手指点击屏幕,会从接触点吸收小量电流,造成角落电极的压降,利用感应人体微弱电流的方式来达到触控的目的。(这是为什么当你带上手套触摸屏幕时,没有反应的原因),下图可以清晰的说明电容屏的工作原理。二、电容屏模组组成触摸屏:也就是我们手触摸操作的透明部分;触摸IC:当电容屏触摸到时,要解析到触点的位置坐标,就是通过这颗芯片去计算处理的。1、电容式触摸屏的类型主要有两种:(1)、表面电容式: 表面电容式利用位于四个角落的传感器以及均匀分布整个表面的薄膜,有一个普通的ITO层和一个金属边框,当一根手 指触摸屏幕时,从板面上放出电荷,感应在触 屏 的四角完成,不需要复杂的ITO图案;(2)、投射式电容: 采用一个或多个精心设计,被蚀烛的ITO,这些 ITO层通过蛀蚀形成多个水平和垂直电极,采用成行/列交错同时带有传感功能的独立芯片。现在平板电脑、手机、车载等多用投射式电容,所以我们后面分析表明投射式电容的构成。投射电容的轴坐标式感应单元矩阵 :轴坐标式感应单元分立的行和列,以两个交叉的滑条实现 X轴滑条 Y轴滑条 检测每一 格感应单元的电容变化。(示意图中电容,实际为透明的)2、电容触摸屏分辨率,通道数; 上图所示,X,Y轴的透明电极电容屏的精度、分辨率与X、Y轴的通道数有关,通道越多,分辨率越高。3、电容触屏的结构分类:(1)、单层ITO 优点:成本 低,透过率 高,缺点: 抗干扰能力 差(2)、单面双层ITO 优点:性能 好,良率高缺点:成本 较高(3)、双面单层ITO 优点:性能好,抗静电能力强缺点:抗干扰能力差3、电容式触屏的分类及工作原理(1)、自生电容式触摸屏 Cp-寄生电容手指触摸时寄生电容增加:Cp"=Cp/Cfinger检测寄生电容的变化量,确定手指触摸的位置(2)、互电容式触摸屏 CM-耦合电容手指触摸时耦合电容减小 ,检测耦合电容变化量,确定手指触摸的位置四、为什么会出现鬼点,鬼点如何消除1、为什么会出现鬼点? 当一个手指按下时,X、Y轴只有一个交叉点,两个同时按下时就会出现4个交叉点,如下图所示,我们不期望得到的点就是所说的鬼点。2、消除鬼点的方法(1)、分时法:基于时间的多点触摸,假设多点触摸 分时进行,操作间 隔续集毫秒;(2)、分区法:将整个触屏物理上分割几个区域 通过判断触摸进入推出 相应区域,从而分出鬼点中分 出真实点。

如何将ogre项目编译成apk文件,然后在Android手机上安装运行!!!!!!!!!????

只要你Run As Android Application 过,到工作目录的bin文件夹下就能找到与项目同名的apk文件A.选中项目,右键=》Andoid Tools=》Export Unsigned Application Package,直接保存就行,这是未签名的。或者B.选中项目,右键=》Andoid Tools=》Export Signed Application Package,后面一步步的去做,这是签过名的。

刚刚在linux下编译好了ogre 3D渲染引擎,怎样将它移植到Android中啊。

是用什么编译器编译的?

一个gameloft出的赛车游戏,能撞警察,也能开警车撞人,android和ios上面都有,做得很逼真,忘了叫什么。

横冲直撞或是极品飞车还是暴力摩托啊??????

vivoy13手机系统升级出现android system recovery〈3e〉等英文显示,一直解决不

如果手机进入了recovery模式,建议先尝试以下方法解决:1、按音量减键选择reboot system now按开关机确认看能否将手机正常开机。2、按音量减键选择wipe data/factory reset 按开关机确认,等界面跳转之后,再按音量减键选择reboot system now 按开关键确认。3、使用读卡器连接电脑,再搜索vivo官网--服务--下载对应机型的固件包到SD卡,然后将SD卡安装到手机按音量减键选择Apply update from external sdcard 按开关键确认,再按音量减键选择下载的固件包按开关机确认,等升级进度条走完以后按音量减键选择reboot system now按开关键确认。如果按照以上方法操作了还是无法将手机正常开机,可以前往当地的售后服务中心检测处理,进入vivo官网--服务--服务网点中查询距离最近的售后地址及联系电话。

pgm格式文件怎么打开 android

下面的软件能将 .pgm的文件的转换为其他格式:XnView, Gimp, IrfanView, OpenOffice.org例如,使用上述软件,.pgm文件可以转换成下列格式之一bmp, gif, jpg, pcx, png, ppm, tga, tif, emf, eps, ico, pbm, psd, r

android怎么监听媒体被静音

工具android方法1.当用户设置情景模式时,系统会广播一个 RING_MODE_CHANGE_ACTION 消息2.可以定义一个广播接收器,监听此消息3.通过 AudioManager 提供的接口判断当前的情景模式做出特定的处理。关键代码private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(AudioManager.RING_MODE_CHANGE_ACTION)) { AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE); final int ringerMode = am.getRingerMode(); switch (ringerMode) { case AudioManager.RINGER_MODE_NORMAL: //normal break; case AudioManager.RINGER_MODE_VIBRATE: //vibrate break; case AudioManager.RINGER_MODE_SILENT: //silent break; } } }}

Android 5.0新的特性对开发者会有什么影响

影响就是:你得学习...

Android 情景模式(静音、震动、铃声)如何设置和获取这些状态?高手们速来!急!

手动打字解答的,希望可以帮助到你!我之前也没考虑过这个问题,然后研究了下AudioManager,发现当你的振铃模式发生改变的时候有个广播:(Action:)RINGER_MODE_CHANGED_ACTION然后他判断的依据是:public static final int RINGER_MODE_NORMAL若打开振动设置,则它是振动的。(肯定有响铃,有没有振动要看振动设置.情况:(1)如果你上一次RINGER_MODE_CHANGED_ACTION触发的时候状态是变为了RINGER_MODE_VIBRATE)那么这次触发有可能是变为RINGER_MODE_SILENT或者RINGER_MODE_NORMAL两种,那就很明显了如果是RINGER_MODE_SILENT,就是没有振动也没有响铃,如果是RINGER_MODE_NORMAL就是有振动又有响铃(2)如果你上一次RINGER_MODE_CHANGED_ACTION触发的时候状态是变为了RINGER_MODE_SILENT)那么这次触发有可能是变为RINGER_MODE_VIBRATE或者RINGER_MODE_NORMAL两种,那就很明显了如果是RINGER_MODE_VIBRATE,就是只有振动没有响铃,如果是RINGER_MODE_NORMAL就是没有振动只有响铃public static final int RINGER_MODE_SILENT振铃模式是静音且不振动。(既没有振动也没有响铃)public static final int RINGER_MODE_VIBRATE 振铃模式是静音且振动。(只有振动没有响铃)

关于android中wifi的RSSi信号测距的问题···求大神指点

太深奥鸟……

如何检查 Android 应用的内存使用情况

进入“”设置“” 点击 应用

android开发课程设计报告需求分析怎么写

可以做这个~~

Android开发,对接融云客服时,点击发送表情崩溃,报错信息如下

怎么解决定位

android融云即时通讯如何获取最近一条聊天消息的时间

身边只有环信的程序猿盆友,得到以下答案: 环信的话很简单调用conversation.getLastMessage().getMsgTime()就得到了。虽然文不对题,仅供参考。

Android图片框架对比

对比现在主流图片框架的优势和缺点,在实际项目中如何选择适合自己的框架; Glide、Fresco、Picasso、ImageLoader 共同优点: 以上名词介绍 在分析他们的差异、优缺点之前,我们先了解图片缓存通用的概念: 以上概念在不同框架之间可能不同,比如Displayer在ImageLoader中叫做ImageAware,在Picasso和Glide中叫做Target。 以上为Glide的总体设计图。 整个库分为RequestManager(请求管理器)、Engine(数据获取引擎)、Fetcher(数据获取器)、MemoryCache(内存缓存)、DiskLRUCache(本地缓存)、Transformation(图片处理)、Encoder(编码处理)、Registry(图片类型以及解析器配置)、Target(目标)等模块。 简单流程: Glider收到加载及显示资源任务,创建Request并将它交给RequestManager,Request启动Engine去数据源获取资源,得到资源后通过Transformation处理后交给Target. Glide依赖DiskLRUCache、GifDecoder等开源库去完成本地缓存和Gif图片解密工作; 为Bitmap 维护一个BitmapPool对象池, 对象池的主要目的是通过减少大对象的分配以重用来提高性能! 缺点 : ①图片质量低:因为机制不同,速度快,但是图片的质量降低了RGB565; ②多尺寸缓存导致内存和磁盘占用多:根据ImageView大小来缓存,可能会导致一张图片可能根据展示情况来缓存不同尺寸的几份; 扩展理解参考: https://www.jianshu.com/p/1ab5597af607 以上为Picasso的总体设计图。 整个库分为Dispatcher、RequestHandler以及Downloader、PicassoDrawable等模块。 简单流程: Picasso收到加载显示图片任务后,创建Request并将它交给Dispatcher,Dispatcher分发任务到具体RequestHandler,任务通过MemoryCache及Handler(数据获取接口)获取图片,图片获取成功后通过PicassoDrawable显示到Target中; 上面Data的File system部分,Picasso没有自定义本地缓存的接口,默认使用http的本地缓存,API19以上使用okhttp,一下使用UrlConnection,所以如果需要自定义本地缓存就需要自定义Downloader; 缺点 :加载速度没有其他框架快; 特点 :只缓存一个全尺寸的图片,根据需求的大小在压缩转换; 以上为Fresco的总体设计图 整个库分为UI:DraweeView(View控件)、Drawable(图片数据)、DraweeController(图片控制器)、DraweeHiierarchy(图片体系);Core:DataSource(数据源)、ImagePipeline(图像管道)、Producer(生产者)、ProducerFacotry(生产工厂)、Subcriber(订阅)、Supplier(供应者)、Consumer(消费者);IO/Data:MemoryCache(内存缓存)、Network、DiskCache(磁盘缓存)、Recourse(本地资源) 简单流程: 从上面的结构可以看出,fresco主要采用了工厂+建造者的模式实现功能,逻辑划分比较清楚;Fresco框架整体是一个MVC模式,DrawableView--->View用来显示顶层视图、DrawableController--->Control控制加载图片的配置 事件的分发、DrawableHierarchy--->Model 用于存储和描述图片信息,同时也封装了一些图片的显示和视图层级的方法;ImagePipeline模块负责从网络、本地文件系统、本地资源加载图片 缺点: ①框架大,影响Apk体积; ②一定的学习成本,使用比较繁琐,需要使用内部提供的ImageView控件,使用起来比较复杂;

Android Picasso 的缓存怎么清理

试试Picasso.with(getActivity()).invalidate(file);

为什么android用不了picasso

  图片为安卓应用添加了必备内容和视觉风格。Picasso允许应用程序加载图片——往往只需一行代码!  Picasso.with(context).load("url").into(imageView);  Picasso会自动处理安卓加载图片时出现的许多常见缺陷:  1.在适配器中处理ImageView循环和下载取消。  2.保证最小内存使用率情况下的复杂图片转换。  3.自动内存和磁盘高速缓存。  特性  适配器下载  可以自动检测适配器复用  @Override public void getView(int position, View convertView, ViewGroup parent) {    SquaredImageView view = (SquaredImageView) convertView;    if (view == null) {  view = new SquaredImageView(context);  }    String url = getItem(position);  Picasso.with(context).load(url).into(view);    }  图像变换  变换图像可以更好地适应布局,并且减少内存大小。  Picasso.with(context)  .load(url)  .resize(50, 50)  .centerCrop()  .into(imageView)  可以指定自定义变化以便达到更好效果。  public class CropSquareTransformation implements Transformation {    @Override public Bitmap transform(Bitmap source) {    int size = Math.min(source.getWidth(), source.getHeight());    int x = (source.getWidth() - size) / 2;    int y = (source.getHeight() - size) / 2;    Bitmap result = Bitmap.createBitmap(source, x, y, size, size);    if (result != source) {    source.recycle();    }    return result;    }    @Override public String key() { return "square()"; }    }把该类的实例传递给变换方法。  占位符  Picasso把下载和错误占位符作为可选功能。  Picasso.with(context)  .load(url)  .placeholder(R.drawable.user_placeholder)  .error(R.drawable.user_placeholder_error)  .into(imageView);  在显示错误占位符前请求会重试三次。      资源加载  资源,资产,文件,内容供应商均可作为图像源。  Picasso.with(context).load(R.drawable.landing_screen).into(imageView1);    Picasso.with(context).load(new File(...)).into(imageView2);    DEBUG指标  开发时可以启用彩带来指示图像源。在Picasso实例中调用setIndicatorsEnabled(true)。

android picasso怎么使用

1.加载载网络或本地图片并自动缓存处理;2.链式调用;3.图形转换操作,如变换大小,旋转等,提供了接口来让用户可以自定义转换操作;4.在Adapter中回收和取消当前的下载功能;与Universal-ImageLoader库对比:1.都有高效的网络图片下载和缓存性能;2.Universal-ImageLoader功能多,灵活使用配置;3.Picasso使用复杂的图片压缩转换来尽可能的减少内存消耗;4.在Adapter中需要取消已经不在视野范围的ImageView图片资源的加载,否则会导致图片错位,Picasso已经解决了这个问题;用法:1.图片转换:转换图片以适应布局大小并减少内存占用Picasso.with(context).load(url).resize(50, 50) .centerCrop() .into(imageView);2.Adapter 中的下载:Adapter的重用会被自动检测到,Picasso会取消上次的加载;3.空白或者错误占位图片设置方法及本地资源文件的加载方法;4.Picasso采用链式调用加载和处理图片方式;5.除了加载网络图片,picasso还支持加载Resources, assets, files, content providers中的本地资源文件;

如何将html5程序打包成Android应用

http://jingyan.baidu.com/article/3d69c5517186e0f0cf02d7ef.html

Android的startForeground前台Service如何去掉通知显示

一、正常的前台Service我们都知道,Service几乎都是在后台运行的,所以Service的系统优先级还是比较低的,当系统出现内存不足情况时,就有可能回收掉正在后台运行的Service。如果你希望Service可以一直保持运行状态,而不会由于系统内存不足的原因导致被回收,那么就要提高Service的优先级,而提高优先级的方法有多种,其中一种就是考虑使用前台Service。如何把Service设置为前台Service?很简单,使用startForeground即可。要取消前台,使用stopForeground即可。不多说,直接上代码,非常的简单,不解释:public class MyService extends Service {private static final String TAG = "wxx";@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();Log.d(TAG, "MyService: onCreate()");//定义一个notificationNotification notification = new Notification();Intent notificationIntent = new Intent(this, MainActivity.class);PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);notification.setLatestEventInfo(this, "My title", "My content", pendingIntent);//把该service创建为前台servicestartForeground(1, notification);}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// TODO Auto-generated method stubLog.d(TAG, "MyService: onStartCommand()");return super.onStartCommand(intent, flags, startId);}}有留心的朋友会发现,每当启动该前台Service的时候,手机都会收到一个通知,下拉通知栏,会看到一个通知如“XXService正在运行。”,如下图:查看文档,知道,当SDK<18时,系统不会有该通知,当SDK>=18时,系统有显示该通知。系统显示该通知,应该是为了防止滥用“startForeground”。那,如果我就是不想显示该通知给用户?怎么搞?二、去掉startForeground的通知本人之前因接触过一些通知相关的内容,于是,大胆假设:把2个同进程的Service都用startForeground设置为前台进程,但他们使用相同的Notification ID,那么他们只会产生一个通知,然后把其中一个Service取消前台效果,那么就会把通知关闭,剩下的那个Service就是前台Service了,而且通知栏没有通知。有了假设,当然就要验证是否可行~~看代码吧。。。先看最后要保留的那个Service的代码:public class MyService extends Service {private static final String TAG = "wxx";private final int PID = android.os.Process.myPid();private AssistServiceConnection mConnection;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();Log.d(TAG, "MyService: onCreate()");setForeground();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// TODO Auto-generated method stubLog.d(TAG, "MyService: onStartCommand()");return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();Log.d(TAG, "MyService: onDestroy()");}public void setForeground() {// sdk < 18 , 直接调用startForeground即可,不会在通知栏创建通知if (VERSION.SDK_INT < 18) {this.startForeground(PID, getNotification());return;}if (null == mConnection) {mConnection = new AssistServiceConnection();}this.bindService(new Intent(this, AssistService.class), mConnection,Service.BIND_AUTO_CREATE);}private class AssistServiceConnection implements ServiceConnection {@Overridepublic void onServiceDisconnected(ComponentName name) {Log.d(TAG, "MyService: onServiceDisconnected");}@Overridepublic void onServiceConnected(ComponentName name, IBinder binder) {Log.d(TAG, "MyService: onServiceConnected");// sdk >=18// 的,会在通知栏显示service正在运行,这里不要让用户感知,所以这里的实现方式是利用2个同进程的service,利用相同的notificationID,// 2个service分别startForeground,然后只在1个service里stopForeground,这样即可去掉通知栏的显示Service assistService = ((AssistService.LocalBinder) binder).getService();MyService.this.startForeground(PID, getNotification());assistService.startForeground(PID, getNotification());assistService.stopForeground(true);MyService.this.unbindService(mConnection);mConnection = null;}}private Notification getNotification() {// 定义一个notificationNotification notification = new Notification();Intent notificationIntent = new Intent(this, MainActivity.class);PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,notificationIntent, 0);notification.setLatestEventInfo(this, "My title", "My content",pendingIntent);return notification;}再看那个辅助消除通知的Service的代码,非常的简单:public class AssistService extends Service {private static final String TAG = "wxx";public class LocalBinder extends Binder {public AssistService getService() {return AssistService.this;}}@Overridepublic IBinder onBind(Intent intent) {Log.d(TAG, "AssistService: onBind()");return new LocalBinder();}@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();Log.d(TAG, "AssistService: onDestroy()");}}代码就这么多,上面大体思路是:一个最后保留的MyService,一个辅助消除通知的AssistService, 利用MyService去绑定AssistService,在关联函数onServiceConnected()中实现两个Service调用startForeground变为前台服务,注意一定要使用一样的Notification ID,然后AssistService取消前台效果stopForeground从而删除通知。

android前台服务以及通知

前台服务是那些被认为用户知道(用户认可所认可)且在系统内存不足的时候 不允许系统杀死 的服务。前台服务 必须给状态栏提供一个通知 ,它被放到正在运行(Ongoing)标题之下——这就意味着 通知只有在这个服务被终止或从前台主动移除通知后才能被解除。 Notification支持文字内容显示、震动、三色灯、铃声等多种提示形式,在默认情况下,Notification仅显示消息标题、消息内容、送达时间这3项内容。 Notification:通知信息类,它里面对应了通知栏的各个属性。 NotificationManager : 状态栏通知的管理类,负责发通知、清除通知等操作。 构建通知的步骤: 更新通知 要想更新通知,需要利用 NotificationManager.notify() 的id参数,该id在应用内需要唯一。要想更新特定id的通知,只需要创建新的Notification,并发出与之前所用 id 相同的 Notification。 如果之前的通知仍然可见,则系统会根据新的 Notification 对象的内容更新该通知。相反,如果之前的通知已被清除,系统则会创建一个新通知。 删除通知 删除通知可以有多种方式: 1.通过 NotificationCompat.Builder 设置 setAutoCancel(true) ,这样当用户点击通知后,通知自动删除。 2.通过 NotificationManager.cancel(id) 方法,删除指定 id 的通知 3.通过 NotificationManager.cancelAll() 方法,删除该应用的所有通知 关于前台服务和通知更具体的内容可参考 紫豪

Android 4.3 新增的 notification service 有什么用

Notification通知将一个图标(包含一条可选的提示文本信息)填加到系统的(一般来说,Android手机的是在顶部,非底部,要注意噢)中,并将一条展开信息添加到通知窗口中。当用户选中展开信息时,Android将执行一个此通知已定义的意图Intent(通常用于弹出一个Activity)。你还可以对通知进行配置,用设备提供的声音、振动、闪光来提醒用户。  当后台服务(Service)需要对某个事件发出提醒并且需要用户响应时,通知就能发挥作用了。后台服务从来不会启动Activity来接收用户的交互,取而代之的是应该创建一个状态栏通知,在用户点选后再由通知来启动Activity。  Activity或者Service都能一个状态栏通知。可因为Activity只有在活动状态并获得焦点时才能执行操作,所以在实际开发中使用Service来创建状态栏通知居多。这样,即使用户正在使用其他程序或者设备已经休眠时,仍然可以从后台创建通知。要创建一个通知,须用到两个类:Notification类和NotificationManager类。  NotificationManager是一个Android系统服务,用于管理和运行所有通知。NotificationManager不能被实例化,为了把Notification传给它,你可以用getSystemService()方法获取一个NotificationManager的引用。在需要通知用户时再调用notify()方法将Notification对象传给它。  创建Notivication通知步骤:  (1)获取NotificationManager的引用[java] view plaincopyNotificationManager notificationManager=(NotificationManager)                     super.getSystemService(Context.NOTIFICATION_SERVICE);   (2)实例化Notification[java] view plaincopy       Notification notification=new Notification( R.drawable.ic_launcher, "Notification消息提示!", System.currentTimeMillis());   (3)指定通知的展开信息和Intent[java] view plaincopy       PendingIntent intent=PendingIntent.getActivity( this, 0, super.getIntent(), PendingIntent.FLAG_UPDATE_CURRENT); tification.setLatestEventInfo( this, "跟我学yoheshow", "尤伊秀", intent);   (4)将Notification对象传给NotificationManager[java] view plaincopy       notificationManager.notify( "Genwoxue", R.drawable.ic_launcher, notification);   如果想要发送状态栏通知,通过notify(int, Notification)传递Notification对象给NotificationManager即可。第一个参数是Notification 的唯一ID,第二个参数是Notification对象。ID在整个应用程序范围内唯一标识Notification。应用程序可能管理着多种不同的通知,在用户通过各自定义的Intent返回应用程序时必须能选择正确的动作执行之,因此上述参数是必需的。

android notification怎么在状态栏显示图标

setLatestEventInfoNotification.FLAG_***配合使用

android开发 如何隔一段时间发一个notification

如果是本地,那么就写一个时间线程,每间隔一段时间创建一次就可以了。如果是网络推送,那么服务器,隔一段时间推送一次就ok

android中如何清除系统的notification?

Notification notification = new Notification(R.drawable.icon, "嘎你妹", System.currentTimeMillis());NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);Intent ii = new Intent();PendingIntent contentIntent = PendingIntent.getActivity(context, 0, ii, PendingIntent.FLAG_UPDATE_CURRENT);notification.flags = Notification.FLAG_AUTO_CANCEL;notification.defaults = Notification.DEFAULT_SOUND;Intent i = new Intent("com.android.broadcasttest.xxx");//已有广播notification.deleteIntent = PendingIntent.getBroadcast(this, 0,i, 0);notification.setLatestEventInfo(context, "嘎嘎消息",String.format("共%d条新消息", 1), contentIntent);nm.notify(R.string.app_name, notification);一个例子,希望楼主采纳。

android 怎么监听系统发出了Notification

 Notification看名字就知道,是一个和提醒有关的东西,它通常和NotificationManager一块使用。具体来说,其主要功能如下。  1.NotificationManager和Notification用来设置通知  通知的设置等操作相对比较简单,基本的使用方式就是新建一个Notification对象,设置好通知的各项参数,然后使用系统后台运行的NotificationManager服务将通知发出来。基本步骤如下。  1)得到NotificationManager,代码如下。[java] String ns = Context.NOTIFICATION_SERVICE; tificationManager mNotificationManager = (NotificationManager) getSystemService(ns);   2)创建一个新的Notification对象,代码如下。[java] Notification notification = new Notification(); tification.icon = R.drawable.notification_icon;   也可以使用稍微复杂一些的方式创建Notification,代码如下。[java] int icon = R.drawable.notification_icon; //通知图标 CharSequence tickerText = "Hello"; //状态栏(Status Bar)显示的通知文本提示 long when = System.currentTimeMillis(); //通知产生的时间,会在通知信息里显示 Notification notification = new Notification(icon, tickerText, when);   3)填充Notification的各个属性,代码如下。[java] Context context = getApplicationContext(); CharSequence contentTitle = "My notification"; CharSequence contentText = "Hello World!"; Intent notificationIntent = new Intent(this, MyClass.class); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);   状态栏(Status Bar)显示的通知文本提示,例如:[java] notification.tickerText = "hello";   发出提示音,例如:[java] notification.defaults |= Notification.DEFAULT_SOUND; notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3"); notification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6");   手机振动,例如:[java] notification.defaults |= Notification.DEFAULT_VIBRATE; long[] vibrate = {0,100,200,300}; notification.vibrate = vibrate;   LED灯闪烁,例如:[java] notification.defaults |= Notification.DEFAULT_LIGHTS; notification.ledARGB = 0xff00ff00; notification.ledOnMS = 300; notification.ledOffMS = 1000; notification.flags |= Notification.FLAG_SHOW_LIGHTS;   4)发送通知,代码如下。[java] private static final int ID_NOTIFICATION = 1; otificationManager.notify(ID_NOTIFICATION, notification);   5)实现点击后不消失[java] notification.flags = Notification.FLAG_NO_CLEAR; 2.更新通知  如果需要更新一个通知,只需要在设置好Notification之后,再调用setLatestEventInfo,然后重新发送一次通知即可。  为了更新一个已经触发过的Notification,传入相同的ID。用户既可以传入相同的Notification对象,也可以是一个全新的对象。只要ID相同,新的Notification对象会替换状态条图标和扩展的状态窗口的细节。  另外,还可以使用ID来取消Notification,通过调用NotificationManager的cancel方法,代码如下。  notificationManager.cancel(notificationRef);  当取消一个Notification时,会移除它的状态条图标以及清除在扩展的状态窗口中的信息。

android notification自动消失

这两种属性值是让notification无法被删除的,而FLAG_AUTO_CANCEL是在点击之后notification就会消失的,你可以参考下google的参考文档,我怀疑是你的代码逻辑哪里有问题!

android为什么不支持sd卡

强制允许将应用写入外部设备的意思就是强制允许应用可以安装写入到SD卡中,这个是因为老的手机内存小,那时候往往会安装到外部存储设备上(其实也是部分安装),会影响运行速度的。随着手机的发展,大量的手机内存已经达到了64G以上,不会像之前出现很小内存的手机,所以也都不怎么支持SD卡了,也就没有强制允许将应用写入外部设备了。但是在存储空间比较小的安卓设备上还是有该功能。Android 是运行于Linux kernel之上,但并不是GNU/Linux。因为在一般GNU/Linux 里支持的功能,Android 大都没有支持,包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。Android又以Bionic 取代Glibc、以Skia 取代Cairo、再以opencore取代FFmpeg等等。

android是什么操作系统?

强制允许将应用写入外部设备的意思就是强制允许应用可以安装写入到SD卡中,这个是因为老的手机内存小,那时候往往会安装到外部存储设备上(其实也是部分安装),会影响运行速度的。随着手机的发展,大量的手机内存已经达到了64G以上,不会像之前出现很小内存的手机,所以也都不怎么支持SD卡了,也就没有强制允许将应用写入外部设备了。但是在存储空间比较小的安卓设备上还是有该功能。Android 是运行于Linux kernel之上,但并不是GNU/Linux。因为在一般GNU/Linux 里支持的功能,Android 大都没有支持,包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。Android又以Bionic 取代Glibc、以Skia 取代Cairo、再以opencore取代FFmpeg等等。

Android高手进:setText()的用法?

全部DOCPDFPPTXLSTXTAndroid 高手进阶教程 Android 高手进阶教程,手机,开发Android 高手进阶教程,手机,开发下载本文档需要登录,并付出相应积分。大小: 2.6MB所需积分:1已有6人评价浏览:97次下载:16次贡献时间:2010-12-02贡献者:崭露头角 三级 5人评72页 7人评161页 12人评112页 1人评23页 1人评4页 3155人评101页 2947人评268页 2435人评279页 3363人评114页 2279人评279页如要投诉或提出意见建议,请到反馈。

android系统是什么

智能设备系统分为ios系统和android系统,那android系统是什么呢,让我们一起来看看吧~android系统是什么android系统是美国谷歌公司开发的移动操作系统,是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的操作系统。Android的系统架构和其操作系统一样,采用了分层的架构。从架构图看,Android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux内核层。Android是运行于Linuxkernel之上,但并不是GNU/Linux。因为在一般GNU/Linux里支持的功能,Android大都没有支持,包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。Android又以Bionic取代Glibc、以Skia取代Cairo、再以opencore取代FFmpeg等等。本文以小米12为例适用于MIUI13系统

处理程序com.android.phone已停止怎么解决?(一键刷机后出现的)

您好:根据您的描述:手机在接打电话时提示“com.android.phone 进程意外停止”,是由于来电归属地问题导致。来电归属地由第三方公司提供,当第三方公司进行系统升级时,就会出现此现象。1、设置-应用程序-管理应用程序-全部-手机(电话的符号)-清除数据2、备份手机重要数据恢复出厂设置,排除软件问题若故障依旧,建议您将手机送至就近的三星服务中心进行检测维修具体服务中心查询请访问:http://www.samsung.com/cn/support/location/supportServiceLocation.do?page=SERVICE.LOCATION&cid=cn_ppc_support_service_repairnet_120522欢迎您访问三星数字服务平台:http://support.samsung.com.cn/ask

android factory mode怎么卡刷

android factory mode卡刷的方法如下:1.到官网找到所需的ROM。手机进行卡刷:关机(电量50%以上)—同时按住音量上键,菜单键,电源键,出现界面后按音量下键。2.进入recovery模式后的第一件就是先进行双wipe,进行下面的操作,(在recovery模式里按音量上下键是进行选,按HOME键表示确认)。3.先选中 wipedata/factory reset——选 Yes——选 delete all user data 确认。4.再选中 wipecache partition——选Yes---选 Wipe Cache 确认。5.然后按按音量选择installzip from sdcard,然后再出现的界面里选择choose zip from sdcard,然后找到刚才放放到sd卡根目录下的zip格式的rom刷机包,然后按HOME键进行确认,然后然后选YES。6.开始刷机,刷机完成后返回recovery主界面,选中reboot system now,确认后开始重启7.卡刷刷机结束,开机升级完成。

『38』在Android平台做阅读笔记的方法

在 Android 平台记笔记,指的是用手机或者安卓平板写笔记,这里暂时不包括其他设备。 该平台的特点是,移动能力强,便携,但是办公能力弱。这里的阅读是非常方便的,在很多软件的帮助下,阅读体验往往比电脑更好,而且便携性使得这里的阅读可以保证高度连续性。单纯从『阅读』看,这真的是相当优秀的平台,所以,如果能在这样优秀的阅读平台上方便地『写读书笔记』的话,那就太完美了。 马驴我作为“不记笔记会死星人”呢,在这个方面也是各种尝试,费了不少力气,但一直没有很理想的效果,甚至一直连“够用”这个级别的解决方案都没有遇到。直到最近,某个神器的新版本出现,才在很大程度上解决了这个问题(具体是什么,我会在后面说明,这里先卖个关子)。所以现在总算是有了一些相对成体系的解决方案了。 一切一切的前提都是,阅读的同时要记笔记。如果只是单纯的阅读而不记笔记的话,这样的阅读适合于看小说之类的超浅阅读材料,所以不在本文的讨论范围内。嗯,所以在 Android 上阅读也要有良好的记笔记条件才理想。 三星的Note系列我没有见过,所以不清楚一支笔能带来怎样的扭转。单纯说常见的纯触屏设备吧,这些设备如果想要在阅读的时候记笔记的话,需要具备 适合笔记的基本条件 : 如果满足这样的条件的话,就能在区域截屏的基础上,对局部进行文字笔记的记录,最后还能将汇总在一起的笔记导出来。 既然上面列举了笔记的基本条件,那么就要针对性地装一些软件。通常是多个工具配合才能良好运转。 阅读器的话,epub的支持是最为广泛的,mobi在手机上除了kindle以外极少有能打开的工具,而kindle的体验太差,所以, 在Android上阅读尽可能将电子书转化为epub格式。 其余的常见格式就是pdf了(可能还有奇葩的caj),这种东西通常不能转epub或者其他格式,即使勉强转化,效果也不理想。所以直接按原始格式阅读即可。 笔记软件其实在Android上并不需要独家列举,毕竟只要有记录功能就够了——吗??才不是。 笔记不仅仅是写下来而已,一定还要有足够强大的方便性,毕竟阅读实在是一件辛苦事:即使你热爱阅读,也一样。 所以,本着方便的需求,对笔记软件进行审视以后可以发现一些值得推荐的工具: Epub类: 其他类: 其他无论是网页还是pdf之类的,笔记都相似,采用独立的笔记软件进行整理比较好。 不得不说的是,除了OneNote外,为知笔记也有类似的快速笔记并添加到上一篇笔记的功能,但只限于『复制』而已,与输入是脱轨的,所以灵活性较差,还不完善。其余软件更是完全没在这方面用力。 前面说过的,『区域截图』工具,在Android上必须Root才能正常工作。Root以后这类工具还是一搜一大把的,感觉不出多大区别,就不推荐了,这一步的难点在于Root。 不Root真的就不能区域截图,只能全屏截图! 万事俱备,现在开始分析阅读笔记的写作方法。 这个很简单。以多看阅读为例,阅读的时候发现较好的段落以后直接长按划线,然后写读书笔记就行了。没什么难度。 值得一提的是,在手机上不容易把握全局逻辑,所以这样的阅读通常不是阅读的终点,还需要在电脑上进行进一步的梳理——如果想要更深一层地理解书中内容的话。但单纯在Android上读epub并记笔记的话,这就够了。 相比之下,这个略微困难。 首先我们开启OneNote的悬浮窗,同时开启区域截图工具,然后开始读pdf。 还是要说OneNote在移动端糟糕的阅读体验……所以这里的笔记通常是不能直接在手机上看的,实在很难看。需要在电脑上整理一下,把多余的笔记容器(方框)合并以后,才能正常适应手机屏幕。 补充:没有Root的Android手机,在这一方面会遇到巨大的困难。。。 网页资料,无论是保存到Pocket之类里面还是直接网页阅读都一样,和读pdf差不多,多一步『分享』。这一步是为了保存来源,毕竟这里的阅读明显要零散得多。 所以步骤为: 这个方法还是要提一下,保证方法的完整性…… 简单来说就是,Android设备只负责显示阅读材料,而笔记由屏幕外面的实体(纸质)纸笔完成。 适合于为课本记笔记。 这个大家都熟悉,难度较小,只不过记笔记以后整理起来较为困难,这是本方法的最大问题。

教你使用剪切板——Android中的复制&粘贴

最近开发过程中有使用到复制/粘帖功能,也在其中遇到了一些问题,就顺势学习一下复制粘贴相关的知识。 Android提供了一个强大的剪切板框架(以至于在复制某些内容粘帖到我的项目中的时候出现的格式问题的BUG)用于复制和粘帖。同时支持简单和复杂的数据类型,简单的文本数据直接存储在剪贴板中,而复杂的数据存储为一个引用,即粘贴应用程序解析为内容提供者(这里涉及到ContentProvider)。 可以看出 Android 剪贴板框架主要涉及到 ClipboardManager 、 ClipData 、 ClipData.Item 、 ClipDescription 这四个类,下面详细说明 接下来看看简单的使用,以文本操作为例 创建 ClipData 的方法还有另外四个: 从剪切板中获取数据,同样以文本操作为例 Designing Effective Copy/Paste Functionality To design effective copy and paste functionality for your application, remember these points: 为设计有效的复制和粘贴功能,请记住以下几点: 参考资料: API Guides: Copy and Paste: https://developer.android.com/guide/topics/text/copy-paste.html#Provider

android求助The method of type must override a superclass method

我的也是1.7,声明implements时候也提示要重写父类的方法。重写了也解决不了。你的解决了吗?给我说说怎么弄的?
 首页 上一页  1 2 3 4 5 6 7 8  下一页  尾页