当前位置: 编程技术>移动开发
本页文章导读:
▪(7)常用控件:TextView EditView (七)常用控件:TextView EditView
TextView
布局:
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
.........
▪ 短信阻截 短信拦截
最近写一个应用(A),需要拦截短信分析。一般是这样实现的:注册一个接受短信Intent-Filter,获取短信广播,分析短信内容然后相应处理。对特定短信终止广播继续.........
▪ object-c 中for循环的两种形式 object-c 中for循环的两种方式
在java中就有两种for的循环写法,同样,在oc中也有两种写法:
第一种:这种是最常用的方式,也是大多数程序员熟悉的方式,
.........
[1](7)常用控件:TextView EditView
来源: 互联网 发布时间: 2014-02-18
(七)常用控件:TextView EditView
TextView
布局:
<TextView android:id="@+id/textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:text="@string/hello_world" tools:context=".MainActivity" />
调用:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView=(TextView)findViewById(R.id.textview);获得控件 mTextView.setText("我的第一个文本");设置文本内容 mTextView.setTextColor(Color.GREEN);设置字体颜色 mTextView.setBackgroundColor(color.black);}设置背景 这些也可在xml中设置
当出现URL E-mail 电话号码时,可以为TextView设置链接:
四种方法实现:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <!-- xml属性实现,添加 android:autoLink="all"实现,为所有种类添加链接--> <TextView android:id="@+id/tv01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:autoLink="all" android:text="@string/first_link" /> <!--通过<a>标签的string资源文件实现--> <TextView android:id="@+id/tv02" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/second_link" /> <!-- 通过在java代码中使用html实现 --> <TextView android:id="@+id/tv03" android:layout_width="fill_parent" android:layout_height="match_parent" /> <!-- 通过java代码直接实现 --> <TextView android:id="@+id/tv04" android:layout_width="fill_parent" android:layout_height="match_parent" /> </LinearLayout>
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //设置textview可点击,实现第二种方式 TextView t2=(TextView)findViewById(R.id.tv02); t2.setMovementMethod(LinkMovementMethod.getInstance()); //使用第三种方式实现 TextView t3=(TextView)findViewById(R.id.tv03); t3.setText( Html.fromHtml("<b>text3:</b>"+"<a href=/index.html"http://www.google.com\">连接到google</a>") ); t3.setMovementMethod(LinkMovementMethod.getInstance()); //创建一个spannablestring对象 SpannableString ss=new SpannableString("text4:点击这里拨打电话,点击这里链接到google"); ss.setSpan(new StyleSpan(Typeface.BOLD), 0, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//0-6个字符为粗体 ss.setSpan(new URLSpan("tel:415113464"), 9, 11, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//9-11为拨号链接 ss.setSpan(new URLSpan("http://www.google.com"), 18, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//18-20为网站链接 ss.setSpan(new BackgroundColorSpan(Color.RED), 23, 29, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//23-29为红色 TextView t4=(TextView)findViewById(R.id.tv04); t4.setText(ss); //实现第四种方式 t4.setMovementMethod(LinkMovementMethod.getInstance()); }}
String:
<string name="first_link"> <b>第一种方式</b> 通过xml属性实现的链接:www.google.cn, 电话:12345645647 </string> <string name="second_link"> <b>第二种方式</b> <a href="http://www.google.com">google</a> </string>
EditText:
android:hint 编辑框空是显示的字符
android:textColorHint 编辑框空时显示字符的颜色
android:inputType 限制输入内容的类型,number,text等
android:digits 限制输入内容,只可取制定的字符
android:maxLenth 限制输入的最长字符数
android:inputType="textPassword" 输入密码模式
妈呀,一个英文的引号,写成了中文的引号了,结果出了其它一堆错误,怎么改都不对。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/yh" /> <EditText android:id="@+id/et" android:textColorHint="#ff2323" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="@string/yonhuming"/> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/mm" /> <EditText android:id="@+id/et1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:inputType="textPassword" android:hint="@string/mima" /> <TextView android:id="@+id/tv" android:layout_width="fill_parent" android:layout_height="match_parent" android:textSize="20sp" /> </LinearLayout>
package example.first; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; import android.view.View.OnKeyListener; import android.widget.EditText; import android.widget.TextView; import android.app.Activity; public class MainActivity extends Activity { private EditText et; private EditText et1; private TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et=(EditText)findViewById(R.id.et); et1=(EditText)findViewById(R.id.et1); tv=(TextView)findViewById(R.id.tv); //设置监听器 et1.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v,int keyCode,KeyEvent event){ if(keyCode==KeyEvent.KEYCODE_ENTER){ tv.setText("您的用户名为:"+et.getText().toString()+ "\n"+"您的密码为:"+et1.getText().toString()); } return false; } }); } }
运行结果:点击回车后显示用户名和密码
[2] 短信阻截
来源: 互联网 发布时间: 2014-02-18
短信拦截
最近写一个应用(A),需要拦截短信分析。一般是这样实现的:注册一个接受短信Intent-Filter,获取短信广播,分析短信内容然后相应处理。对特定短信终止广播继续(abort方法),阻止其进入收件箱。大致就是这么一个过程。
但上述方式,在QQ通讯录/360/飞信存在的情况下,拦截短信失败~也就是说它们抢先拿到了收短信的广播,并将其中断了。那么如何解决这个问题呢~
本来以为腾讯是拦截ril层的消息,然后阻止广播继续,但是这种方式要修改framework才能实现。
后来发现存在广播接收器(Receiver)的Intent-Filter的优先级(priority),SDK里说Prioruty的范围是-1000~1000,若设为一千以上好像跟1000的效果一样。然后我在A应用中的Manifest里将Receiver的Intent-Filter优先级设为1000,但测试结果还是被QQ通讯录抢先。
进一步Google后,得到下面的结论:
反编译QQ通讯录/360手机卫士,发现些许奥秘。貌似这个涉及到Broadcast的分发机制,参考底层代码应该比较好解释~
广播分为2中,无序和有序。可以理解为散列和队列。
首先无序广播,不能中断,所有注册相应Intent-Filter的Reciver都可以接收到~
其次是有序广播,可以中断。它的消息是按优先级传送的,任何一个Receiver在接收后,可以使用abort将其停止,这样就导致了后续的Receiver不能收到广播。
下面是一个猜想,做了些测试,也基本符合~
假设广播接收器的优先级都设为最大整型2147483647,首先动态注册优先级最高,其次是静态注册。在动态注册中,最早注册的优先级最高。在静态注册中,最早安装的程序,优先级最高(注:安装apk会解析af.xml,把其加入队列)
在反编译360后,发现其静态注册的广播接收器里设置的优先级数值为2147483647,然后再广播中启动一个service,在service中注册一个优先级为2147483647的同样地广播接收器。也就是说,假设现在进程全杀,那么短信来了,360和QQ通讯录,谁先安装,谁的静态注册广播接收器就会先启动,然后把广播中断,而且它还启动了一个service又动态注册一个Receiver。这样,它的优先级就排在了所有静态接收器之前了。
所以,我们做个试验,以同样的方式:
首先写一个应用,注册一个开机完成的Receiver
然后再这个Receiver接收到开机广播后,立即启动一个service
然后在service中重新动态注册一个Receiver,优先级为2147483647
重启手机就OK了,抢先360、QQ拦截短信~因为360/QQ并没有在接受开机广播后,动态注册短信广播的接收器。这样重启后A应用就可以在它们之前拦截到短信了~
但上述抢先方式,付出的代价是,A应用需要一直有这么一个service后台运行。一旦被杀,优先权又回被360/QQ抢占,只有等到下次重启。除非A应用在QQ/360之前安装到手机上~
总结一下:
具体的顺~ 代码动态注册的Intent-Filter高于manifest静态注册的Intent-Filter。动态注册中的Intent-Filter在相同优先级下(如整型的最大值),接受顺序是按照动态注册的时间顺序。静态注册中Intent-Filter在相同优先级下,接受顺序是apk的安装顺序。
参考帖子:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=148381
最近写一个应用(A),需要拦截短信分析。一般是这样实现的:注册一个接受短信Intent-Filter,获取短信广播,分析短信内容然后相应处理。对特定短信终止广播继续(abort方法),阻止其进入收件箱。大致就是这么一个过程。
但上述方式,在QQ通讯录/360/飞信存在的情况下,拦截短信失败~也就是说它们抢先拿到了收短信的广播,并将其中断了。那么如何解决这个问题呢~
本来以为腾讯是拦截ril层的消息,然后阻止广播继续,但是这种方式要修改framework才能实现。
后来发现存在广播接收器(Receiver)的Intent-Filter的优先级(priority),SDK里说Prioruty的范围是-1000~1000,若设为一千以上好像跟1000的效果一样。然后我在A应用中的Manifest里将Receiver的Intent-Filter优先级设为1000,但测试结果还是被QQ通讯录抢先。
进一步Google后,得到下面的结论:
反编译QQ通讯录/360手机卫士,发现些许奥秘。貌似这个涉及到Broadcast的分发机制,参考底层代码应该比较好解释~
广播分为2中,无序和有序。可以理解为散列和队列。
首先无序广播,不能中断,所有注册相应Intent-Filter的Reciver都可以接收到~
其次是有序广播,可以中断。它的消息是按优先级传送的,任何一个Receiver在接收后,可以使用abort将其停止,这样就导致了后续的Receiver不能收到广播。
下面是一个猜想,做了些测试,也基本符合~
假设广播接收器的优先级都设为最大整型2147483647,首先动态注册优先级最高,其次是静态注册。在动态注册中,最早注册的优先级最高。在静态注册中,最早安装的程序,优先级最高(注:安装apk会解析af.xml,把其加入队列)
在反编译360后,发现其静态注册的广播接收器里设置的优先级数值为2147483647,然后再广播中启动一个service,在service中注册一个优先级为2147483647的同样地广播接收器。也就是说,假设现在进程全杀,那么短信来了,360和QQ通讯录,谁先安装,谁的静态注册广播接收器就会先启动,然后把广播中断,而且它还启动了一个service又动态注册一个Receiver。这样,它的优先级就排在了所有静态接收器之前了。
所以,我们做个试验,以同样的方式:
首先写一个应用,注册一个开机完成的Receiver
<receiver android:name=".MyBrocast" android:permission="android.permission.BROADCAST_SMS"> <intent-filter android:priority="2147483647"> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> <intent-filter android:priority="2147483647"> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>
然后再这个Receiver接收到开机广播后,立即启动一个service
public void onReceive(Context context, Intent intent) { Log.v("MyBrocast.onReceive", "testtttttttttttt"); if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){ Intent service=new Intent(context, MyService.class); context.startService(service); } }
然后在service中重新动态注册一个Receiver,优先级为2147483647
IntentFilter localIntentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); localIntentFilter.setPriority(2147483647); MyBrocast localMessageReceiver =new MyBrocast(); Log.v("MyBrocast.onReceive", "onCreate"); Intent localIntent = registerReceiver(localMessageReceiver,localIntentFilter);
重启手机就OK了,抢先360、QQ拦截短信~因为360/QQ并没有在接受开机广播后,动态注册短信广播的接收器。这样重启后A应用就可以在它们之前拦截到短信了~
但上述抢先方式,付出的代价是,A应用需要一直有这么一个service后台运行。一旦被杀,优先权又回被360/QQ抢占,只有等到下次重启。除非A应用在QQ/360之前安装到手机上~
总结一下:
具体的顺~ 代码动态注册的Intent-Filter高于manifest静态注册的Intent-Filter。动态注册中的Intent-Filter在相同优先级下(如整型的最大值),接受顺序是按照动态注册的时间顺序。静态注册中Intent-Filter在相同优先级下,接受顺序是apk的安装顺序。
参考帖子:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=148381
[3] object-c 中for循环的两种形式
来源: 互联网 发布时间: 2014-02-18
object-c 中for循环的两种方式
在java中就有两种for的循环写法,同样,在oc中也有两种写法:
第一种:这种是最常用的方式,也是大多数程序员熟悉的方式,
for(int i = 0;i<n;i++){
//your code
}
第二种方式:这种方式又叫for each循环格式如下:
比如有一个数组 NSArray* array,存放的数据类型为UIVeiw
for(UIView* v in array){
//your code
}
最新技术文章: