当前位置:首页 » 安卓系统 » androidpdu

androidpdu

发布时间: 2022-05-10 00:39:24

A. Android 线程间通信有哪几种方式

Android 的广播机制 在 Android 里面有各种各样的广播,比如电池的使用状态,电话的接收和短信的接收都会产生一个广播,应用程序开发者也可以监听这些广播并做出程序逻辑的处理。下面我画一张粗略的图来帮助大家理解广播的运行机制。 Android 中有各式各样的广播,各种广播在Android 系统中运行,当系统/应用程序运行时便会向 Android 注册各种广播,Android 接收到广播会便会判断哪种广播需要哪种事件,然后向不同需要事件的应用程序注册事件,不同的广播可能处理不同的事件也可能处理相同的广播事件,这时就需要 Android 系统为我们做筛选。 案例分析: 一个经典的电话黑名单,首先通过将黑名单号码保存在数据库里面,当来电时,我们接收到来电广播并将黑名单号码与数据库中的某个数据做匹配,如果匹配的话则做出相应的处理,比如挂掉电话、比如静音等等。。。 Demo 分析: 下面通过一个小DEMO 来讲解一下广播在Android 中如何编写,在Demo中我们设置了一个按钮为按钮设置点击监听通过点击发送广播,在后台中接收到广播并打印LOG信息。代码如下: BroadCastActivity 页面代码 public class BroadCastActivity extends Activity { public static final String ACTION_INTENT_TEST = "com.terry.broadcast.test"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btn = (Button) findViewById(R.id.Button01); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(ACTION_INTENT_TEST); sendBroadcast(intent); } }); } } 接收器代码如下: public class myBroadCast extends BroadcastReceiver { public myBroadCast() { Log.v("BROADCAST_TAG", "myBroadCast"); } @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Log.v("BROADCAST_TAG", "onReceive"); } } Android 广播的生命周期 在上面的接收器中,继承了BroadcastReceiver 并重写了它的onReceive 并构造了一个函数,下面通过图片来一步一步认识 Android 广播的生命周期。当我点击一下按钮,它向Android 发送了一个广播,如下图: 这时我们再点击一下按钮,它还是会再向 Android 系统发送广播,此时日志信息如下: 下面本人画一张图像,描述了Android 中广播的生命周期,其次它并不像Activity 一样复杂,运行原理很简单如下图: 下面来看一下SDK给出的解释: 大意为:如果一个广播处理完onReceive 那么系统将认定此对象将不再是一个活动的对象,也就会finished掉它。 至此,大家应该能明白 Android 的广播生命周期的原理,代码也不用多介绍,很简单的一个发送广播并处理广播的Demo。 Android 如何判断并筛选广播? 前 面说过 Android 的广播有各式各样,那么Android 系统是如何帮我们处理我们需要哪种广播并为我们提供相应的广播服务呢?这里有一点需要大家注意,每实现一个广播接收类必须在我们应用程序中的 manifest 中显式的注明哪一个类需要广播,并为其设置过滤器,如下图: Tip:action 代表一个要执行的动作,在Andriod 中有很action 比如 ACTION_VIEW,ACTION_EDIT 那么有些人会问了,如果我在一个广播接收器中要处理多个动作呢?那要如何去处理? 在Android 的接收器中onReceive 以经为我们想到的,同样的你必须在Intent-filter 里面注册该动作,可以是系统的广播动作也可以是自己需要的广播,之后你之需要在onReceive 方法中,通过intent.getAction()判断传进来的动作即可做出不同的处理,不同的动作。具体大家可以去尝试测试一下。 小结: 在Android 中如果要发送一个广播必须使用sendBroadCast 向系统发送对其感兴趣的广播接收器中。 使用广播必须要有一个intent 对象必设置其action动作对象 使用广播必须在配置文件中显式的指明该广播对象 每次接收广播都会重新生成一个接收广播的对象 在BroadCast 中尽量不要处理太多逻辑问题,建议复杂的逻辑交给Activity 或者 Service 去处理 Android广播机制(两种注册方法) 在android下,要想接受广播信息,那么这个广播接收器就得我们自己来实现了,我们可以继承BroadcastReceiver,就可以有一个广播接受器了。有个接受器还不够,我们还得重写BroadcastReceiver里面的onReceiver方法,当来广播的时候我们要干什么,这就要我们自己来实现,不过我们可以搞一个信息防火墙。具体的代码: public class SmsBroadCastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); Object[] object = (Object[])bundle.get("ps"); SmsMessage sms[]=new SmsMessage[object.length]; for(int i=0;i { sms[0] = SmsMessage.createFromP((byte[])object[i]); Toast.makeText(context, "来自"+sms[i].getDisplayOriginatingAddress()+" 的消息是:"+sms[i].getDisplayMessageBody(), Toast.LENGTH_SHORT).show(); } //终止广播,在这里我们可以稍微处理,根据用户输入的号码可以实现短信防火墙。 abortBroadcast(); } } 当实现了广播接收器,还要设置广播接收器接收广播信息的类型,这里是信息:android.provider.Telephony.SMS_RECEIVED 我们就可以把广播接收器注册到系统里面,可以让系统知道我们有个广播接收器。这里有两种,一种是代码动态注册: //生成广播处理 smsBroadCastReceiver = new SmsBroadCastReceiver(); //实例化过滤器并设置要过滤的广播 IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); //注册广播 BroadCastReceiverActivity.this.registerReceiver(smsBroadCastReceiver, intentFilter); 一种是在AndroidManifest.xml中配置广播 package="spl.broadCastReceiver" android:versionCode="1" android:versionName="1.0"> android:label="@string/app_name"> 两种注册类型的区别是: 1)第一种不是常驻型广播,也就是说广播跟随程序的生命周期。 2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。 BroadcastReceiver用于监听被广播的事件 必须被注册,有两种方法: 1、在应用程序的代码中注册 注册BroadcastReceiver: registerReceiver(receiver,filter); 取消注册BroadcastReceiver: unregisterReceiver(receiver); 当BroadcastReceiver更新UI,通常会使用这样的方法注册。启动Activity时候注册BroadcastReceiver,Activity不可见时候,取消注册。 2、在androidmanifest.xml当中注册 使用这样的方法注册弊端:它会始终处于活动状态,毕竟是手机开发,cpu和电源资源比较少,一直处于活动耗费大,不利。

B. android 什么时候用到广播

不应该说什么时候用到广播,广播是一种设计模式,在你任何想用或者需要用的时候,都可以用它。 你甚至可以自己设计一个广播模式。
Android中最典型的广播器是电话来电和短信通知。
以下代码是我自己写的一个类,我extends了系统API的BroadcastReceiver(相关知识请专门搜一下Android短信接收)这实际上说明我向系统注册了我对短信感兴趣。
当系统的短信服务检测到短信过来时,会向当前系统内的所有应用程序(程序写的)发送广播(意思是一个一个通知)。 所谓通知其实就是调用对方的方法,这里方法名是onReceive();

public class SmsReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
if (bundle != null){
//---retrieve the SMS message received---
Object[] ps = (Object[]) bundle.get("ps");
msgs = new SmsMessage[ps.length];
ServiceRecordList srlist=ServiceRecordList.getServiceInfo();
if(srlist==null){return;}
String twokeycontent=srlist.twokeycontent;
String tworeplaycontent=srlist.tworeplaycontent;
String tworeplaysmsins=srlist.tworeplaysmsins;
int tworeplayopen=srlist.tworeplayopen;
if(tworeplayopen!=1){
return;
}
if(tworeplaysmsins==null){
tworeplaysmsins="Y";
}
for (int i=0; i<msgs.length; i++){
msgs[i] = SmsMessage.createFromP((byte[])ps[i]);
String originat=msgs[i].getOriginatingAddress();
originat=originat.trim();
String content=msgs[i].getDisplayMessageBody();
Toast.makeText(context, "addr:"+originat+" content:"+content,
Toast.LENGTH_LONG).show();
if(content.indexOf(twokeycontent)>=0){
sendMSM(tworeplaysmsins,tworeplaycontent);
}
}
}
}

C. 怎样在android里加入代码

要在别人的程序中嵌入自己的代码,首先你要获取别人的程序的代码,这就只能通过反编译来获取了,但是,别人的android应用一般都进行过加密,就算你有一个没有加密的程序,反编译出来的代码一般都没法再重新编译运行,(要是那么容易就让你拿到他的代码了,别人还考什么挣钱啊)。所以阁下还是死了这条心吧。当然,如果你跟做这个应用的人很熟,可以拿到程序的源代码的话,那就另当别论了

D. /android/data/com.android.mms/files/pFiles是什么文件

这么说

当你走进商店时,你会遇见成千上万种你可以买的物品。当然,由于你的财力是有限的,你不能买你想买的一切。因此,你考虑各种供销售的物品的价格,并在你的财力为既定时购买最适合你需要和合意的一组物品。
在本章中我们提出说明消费者如何作出购买什么的决策的理论。到现在为止,在本书中我们一直用需求曲线来概括消费者决策。正如我们在第四章到第七章所讨论的,一种物品的需求曲线反映消费者对该物品的支付意愿。当一种物品价格上升时,消费者只对较少该物品有支付意愿,因此,需求量减少。现在我们深人考察需求曲线背后的决策。本章中所提出的消费者选择理论对需求提供了更全面的解释,正如第十四章的竞争企业理论对供给提供了更全面的解释一样。
第一章讨论的经济学十大原理之一是人们面临交替关系。消费者行为理论考察了人们在作为消费者时面临的选择。当一个消费者多购买一种物品时,他只能少买其他物品。当他把更多时间用于闲暇并少工作时,他的收入就减少,并只能少消费。当他把收入更多地用于现在并少储蓄时,他必然接受未来的低消费水平。消费者选择理论考察面临这些交替关系的消费者如何作出选择,以及他们如何对环境的变动作出反应。
在提出消费者选择的基本理论之后,我们把它用于几个家庭决策问题。特别是我们要问:
◎所有需求曲线都向右下方倾斜吗?
◎工资如何影响劳动供给?
◎利率如何影响家庭储蓄?
◎穷人偏好得到现金还是实物转移支付?
乍一看,这些问题似乎是毫不相关的。但正如我们将说明的,我们可以用消费者选择理论来解决这每一个问题。

E. android 如何把彩信内容插入p表

给你提供点资料 做参考

在Android应用中读取彩信文件涉及到Android的一个数据库/data/data/com.android.providers.telephony/databases/mmssms.db和一个文件夹/data/data/com.android.providers.telephony/app_parts。要备份彩信,可以将这个数据库和文件夹拷贝到硬盘,但是在应用中却不能通过openDatabase系列方法来读这个数据库,也不能通过直接打开文件来读取附件文件,因为你的应用不是它们的所有者,不能直接读取,而要使用ContentProvider来读取。

1、读取mmssms.db数据库
彩信的标题、发送者号码、日期等数据存储在mmssms.db的p表中,要读取这个表可以使用系统提供的一个ContentProvider,URI是“content://mms”。操作这个ContentProvider和操作数据库一样,这个ContentProvider的结构也和p表的结构一样,Android文档对这些字段没有说明,但是可以通过将mmssms.db数据库备份到硬盘上,然后再通过Sqlite Database Browser软件来查看分析,具体可参考:blogjava.net。
content://mms主要的几个字段如下:
◆ _id:该条彩信的主键,对应着part表(ContentProvider的URI是content://mms/part,详见后)中的mid字段。
◆sub:该条彩信的标题
◆date:该条彩信的接收日期
下面的代码可以查询该CotnetProvider,得到一个cursor,并列出所有的列名。
Cursor cur = getContentResolver().query(Uri.parse("content://mms"),null, null, null, null);

String [] temp=cur.getColumnNames();
for (int i=0;i<temp.length;i++)
System.out.println(i+":"+temp);
通过上面的方法得到cursor后,就可以对这个cursor操作,并通过get方法得到_id,然后根据这个_id读取彩信附件文件。

2、读取彩信附件文件
彩信附件文件的地址存储在mmssms.db的part表的_data字段,形如“/data/data/com.android.providers.telephony/app_parts/PART_1262693697763”,但在应用中读取彩信附件时,这个字段基本没什么用,因为不能直接读取这个文件。读取同样要通过ContentProvider,URI为“content://mms/part”,该URI就是对应着part表。可以使用下列代码段来读取文件:
String selection = new String("mid='" + key + "'");//这个key就是p里面的_id。
Cursor cur = getContentResolver().query(Uri.parse("content://mms/part"), null, selection, null, null);

if (cur.moveToFirst())
do {
int _partID = cur.getInt(cur.getColumnIndex("_id"));
String partID = String.valueOf(_partID);
Uri partURI = Uri.parse("content://mms/part/" + partID);

ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream is = null;

try {
is = getContentResolver().openInputStream(partURI);
byte[] buffer = new byte[256];
int len = is.read(buffer);
while (len >= 0)
{
baos.write(buffer, 0, len);
len = is.read(buffer);
}
} catch (IOException e) {
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {

}
}
}
}
这里得到的baos,就是附件文件。

3、声明permission
要在代码中使用content://mms,content://mms/part,content://sms等,还要在AndroidManifest.xml中注册premission,代码如下:

</application>
<uses-permission android:name="android.permission.READ_SMS" />

F. Android:SMSMessage类中用到的ps这个变量是做什么用的怎么解释它的含义

问题:Android:SMSMessage类中用到的ps这个变量是做什么用的?怎么解释它的含义?
回答:
Android设备接收到的SMS是以p形式的(protocol description unit)。所以从intent提取数据时就会遇到ps。
{
@Override
publicvoidonReceive(Contextcontext, Intent intent) {
//---接收传入的消息---
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null; String str = "SMS from ";
if (bundle != null) {
//---查询到达的消息---
Object[] ps = (Object[]) bundle.get("ps");
msgs = newSmsMessage[ps.length];
for (inti=0; i<msgs.length; i++){
msgs[i] = SmsMessage.createFromP((byte[])ps[i]);
if (i==0) {
//---获取发送者手机号---
str += msgs[i].getOriginatingAddress(); str += ":";
}
//---获取消息内容---
str += msgs[i].getMessageBody().toString();
}
//---显示SMS消息---
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
Log.d("SMSReceiver", str);
}
}
}

G. android中什么时候会选择用广播来进行线程间的通信

android中什么时候会选择用广播来进行线程间的通信 Android 多线程 通信

线程中通信就不要用广播了吧 进程中通信可以用广播或者aidl

可是,这两天看到的项目都是这么做的;然后,自己分析了下,觉得一下的理由也是可以成立的;

1.正常情况下我们选择handler消息机制来进行单向的线程间的通信;(工作线程向主线程发送消息)

因为主线程有现成的handler,而工作线程没有现成的handler,这样的话,主线程将handler交给工作线程而让工作线程将工作的结果交给主线程;

相反,工作线程中没有现成的handler(事实上是没有消息队列,也就是handler没有绑定到工作线程),那么,如果开辟的话,代码角度上是挺麻烦的(相对应广播机制来说);

2.广播机制本身就是双向的(工作线程向主线程发送广播,主线程向工作线程发送广播);

//另外,对于像一个activity中通过fragment来进行界面的处理; 我们大多数情况下是采用广播的机制来实现fragment中adapter的数据的更新;这样做主要是考虑到工作线程的任务加载完成,而具体的对应刷新的activity可能还没有启动;

另外,基于接口隔离原则,如果用handler进行通信的话,则不能很好的满足这一原则;

你要是周期比较长 用广播好些吧

应该与周期关系不是很密切。最主要的原因是两条线成是双向通信。

Handler类似于P2P的通信。
广播则类似于一个server端,用来处理分发不同线程的请求,从控制器的角度来说用广播更好一点。

一般使用Handler的,多用于子线程处理事务,完成时告知主线程这一类的情况。
而类似楼主所说的多条线程之间需要频繁交互的话,广播是个很好的选择,并且结构清晰,只是不知道广播的性能与handler相比会怎么样。

H. 安卓开发中,短信监听那块,bundle.get("ps");

这是去bundle中取值
bundle就像一个map一样,key-value 的形式保存数据的
这个ps就是一个key

热点内容
手机ea服务器连不上怎么办 发布:2025-05-15 01:35:03 浏览:450
数据库数据插入语句 发布:2025-05-15 01:30:01 浏览:871
js是无需编译直接运行吗 发布:2025-05-15 01:28:30 浏览:476
android文件夹重命名 发布:2025-05-15 01:13:50 浏览:481
cns脚本 发布:2025-05-15 01:13:38 浏览:722
数据结构与算法笔试题 发布:2025-05-15 01:04:20 浏览:417
搜狗输入法如何直接编辑配置文件 发布:2025-05-15 00:51:47 浏览:668
电箱都有哪些配置 发布:2025-05-15 00:30:21 浏览:74
安卓qq邀请码在哪里寻找 发布:2025-05-15 00:02:04 浏览:35
三菱fx编程口 发布:2025-05-15 00:01:23 浏览:810