project01:阶段性总结

阶段性总结:

-------

1)get一种跳转的封装

2)get√调试的技巧

3)回调机制的学习和理解

4)wifi的开发①开启热点②连接该wifi热点

-------

1) A.activity

public static void comeToMe(Context context) {

Intent intent = new Intent(context, A.class);

context.startActivity(intent);

}

B.activity中调用,只需A.comeToMe(getApplicationContext());

这个样子的写法好处是,如果很多地方需要跳转到activityA的话,这样的封装就不用每次写很多的intent了,一句话ok了;

2)关于调试的技巧:不用每次都是debug as application的,也可以先run起来,这样的好处是,比较快,而且如果是run之后不用拔下来就可以debug了。具体的方法是:打开devices设备选项卡,在里面找到你需要调试的程序,点一下那个debug的按钮,就进入debug调试模式了。

 

3)关于回调函数的应用

有时候,我们可能在activity A中需要跳转到activity B,等B做完处理之后,需要返回一些参数给 activity A,这个时候就用到了回调的思想。不用每次都写个intent发来发去。因为android 系统已经封装了一个现成的回调。具体用法如下:

A.activity中做两件事①启动activity B ②回收B返回的处理结果

①:btn_imei.setOnClickListener(new OnClickListener() {

 

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

Intent intent = new Intent(A.this, B.class);

startActivityForResult(intent, 100);

}

});

btn_mark.setOnClickListener(new OnClickListener() {

 

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

Intent intent = new Intent(A.this, B.class);

startActivityForResult(intent, 101);

}

});

②:protected void onActivityResult(int requestCode, int resultCode,

Intent intent) {

 

if (resultCode == RESULT_OK) {

if (requestCode == 100) {

imei = intent.getExtras().getString("result");

tv_test.setText("imei-----" + imei);

}

if (requestCode == 101) {

mark = intent.getExtras().getString("result");

tv_test.setText("mark----" + mark + "imei-----" + imei);

 

}

}

super.onActivityResult(requestCode, resultCode, intent);

}

 

然后在B.avtivity 中只需要一个步骤,即处理好了之后回传数据:

Intent intent = new Intent(B.this, A.class);

intent.putExtra("result", result);

setResult(RESULT_OK,intent);

finish();

/*详解*/

//startActivityForResult(Intent intent, Int requestCode)

intent 传给B

requestCode >=0就好,随便用于在onActivityResult()区别哪个子模块回传的数据,如果还有C.java ,D甚至E子模块的话,每个区分开不同的requestCode就好。在上面的实例中我们用了100101区分的。

setResut(int resultCode, Intent intent)

resultCode 如果B子模块可能有几种不同的结果返回,可以用这个参数予以识别区分。这里还有个特殊的 RESULT_OK 值,没有特殊情况用它就好了,sdk有说明的。

intent 继续不解释,传回给AonActivityResult()

onActivityResult(int requestCode, int resultCode, Intent intent)

如果不对requestCoderesultCode 加以识别区分的话,只要有其他activity setResult到了A  onActivityResult()会无差别处理。实例中我们是无差处理的。

最后一点,数据回传完成一定要B.finish()掉。

------------

以上是在android系统中封装好的这个回调思想应用。

有时候我们自己也需要写一个自己的.java文件来配合完成,并不是每次的情境都是activity A ->activity B ->activity A,实际需要可能是activity A->class B ->activity A.这样子就不能使用上面的一套了。要自己写。那么问题来了。怎么写。用什么写。

由于刚刚理解清楚这个玩意,所以暂时没有能力讲解,就拿别人写的我看懂的来说明一下吧。

--------

在我们现实生活中,有如下这样场景:有一位老板很忙,他没有时间盯着员工干活,然后他告诉自己的雇员,干完当前这些事情后,告诉他干活的结果。这个例子其实是一个回调+异步的例子,再举一个例子,A程序员写了一段程序a,其中预留了回调函数接口,并封装好了该程序,程序员Ba调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法,到这里你可能似懂非懂了,后面会继续说明回调的出现原因。接下来我们把上面例子变成代码,看到网上很多人最后搞混了异步和回调,因此例子中不加入异步调用。(注意:回调可不是解决什么调用时间过长问题,那是异步!

首先创建一个回调接口,让老板得告知干完活如何找到他的方式:留下老板办公室地址:

[java] view plaincopy

1. package net.easyway.test;  

2.   

3. /** 

4.  * 此接口为联系的方式,不论是电话号码还是联系地址,作为 

5.  * 老板都必须要实现此接口 

6.  * @author Administrator 

7.  * 

8.  */  

9. public interface CallBackInterface {  

10.   

11.     public void execute();  

12. }  

创建回调对象,就是老板本人,因为员工干完活后要给他打电话,因此老板必须实现回调接口,不然员工去哪里找老板?

[java] view plaincopy

1. package net.easyway.test;  

2.   

3. /** 

4.  * 老板是作为上层应用身份出现的,下层应用(员工)是不知道 

5.  * 有哪些方法,因此他想被下层应用(员工)调用必须实现此接口 

6.  * @author Administrator 

7.  * 

8.  */  

9. public class Boss implements CallBackInterface {  

10.       

11.     @Override  

12.     public void execute() {  

13.         System.out.println("收到了!!" + System.currentTimeMillis());  

14.           

15.     }  

16. }  

创建控制类,也就是员工对象,他必须持有老板的地址(回调接口),即使老板换了一茬又一茬,办公室不变,总能找到对应的老板。

[java] view plaincopy

1. package net.easyway.test;  

2.   

3. /** 

4.  * 员工类,必须要记住,这是一个底层类,底层是不了解上层服务的 

5.  * @author Administrator 

6.  * 

7.  */  

8. public class Employee {  

9.   

10.     private CallBackInterface callBack = null;  

11.       

12.     //告诉老板的联系方式,也就是注册  

13.     public void setCallBack(CallBackInterface callBack){  

14.         this.callBack = callBack;  

15.     }  

16.       

17.     //工人干活  

18.     public void doSome(){  

19.         //1.开始干活了  

20.         for(int i=0;i<10;i++){  

21.             System.out.println("第【" + i + "】事情干完了!");  

22.         }  

23.           

24.         //2.告诉老板干完了  

25.         callBack.execute();  

26.     }  

27. }  

-------

上面是别人的博客,我看了很多的,关于回调的机制,就这个例子看懂了,真正的get到了回调怎么写。下面讲下我自己个理解,比如在你android开发过程中,有个activity A ,有一部分逻辑需要一个工具类worker来完成。那么时序应该是:

A-->worker-->A;这个就是回调的原因。

所以这里的activity A就是那个老板,那个worker工具类就是工人。

那么问题来了,老板和工人各自需要做些什么呢?

首先,工人需要汇报老板,那么就需要知道老板的电话,所以,worker中需要定义一个接口,public interface CallbackInterface{public void execute()};

那么,我们知道的,接口不能在这边实现里面具体的方法,那具体的实现在哪里写呢?

就像,老板本人得知道工人任务完成了啊,所以老板那边要实现回调接口,你打电话来的时候我就知道了。

1. public class Boss implements CallBackInterface {  

2.       

3.     @Override  

4.     public void execute() {  

5.         System.out.println("收到了!!" + System.currentTimeMillis());  

6.           

7.     }  

8. }  

那么老板的事情就完成了,通过定义接口工人知道了老板的手机号码,通过实现接口老板也知道了工人事情干好了。

剩下的就是工人要干活了啊,所以worker工具类里面要注册一下那个接口,相当于告诉工人老板的联系方式是这个,然后就是干活,活干完了要告诉老板,即要回调老板实现的接口。

1. package net.easyway.test;  

2.   

3. /** 

4.  * 员工类,必须要记住,这是一个底层类,底层是不了解上层服务的 

5.  * @author Administrator 

6.  * 

7.  */  

8. public class Employee {  

9.   

10.     private CallBackInterface callBack = null;  

11.       

12.     //告诉老板的联系方式,也就是注册  

13.     public void setCallBack(CallBackInterface callBack){  

14.         this.callBack = callBack;  

15.     }  

16.       

17.     //工人干活  

18.     public void doSome(){  

19.         //1.开始干活了  

20.         for(int i=0;i<10;i++){  

21.             System.out.println("第【" + i + "】事情干完了!");  

22.         }  

23.           

24.         //2.告诉老板干完了  

25.         callBack.execute();  

26.     }  

27. }  

那个活干完了,就是说,你需要工具类处理的事情完成了,可以通知我(本人是老板)一下了。以上就是我get到的java中回调思想。总结一下,工具类需要做的是定义一下接口,然后注册一下接口,然后就是干活,干好的时候(满足回去的条件了)回调老板那边已经实现的接口。而老板做的就是实现那个接口中没有实现的方法,“哦,我知道了(交代你的事情处理好了),好的~”。

4)关于wifi的开发

Wifi不多说,这里讲两点,①开启热点AP;②编码实现连接上该热点AP

先上开启热点AP的代码:

public void setupWifiAp(String name) throws Exception {

 

if (name == null || "".equals(name)) {

throw new Exception("the name of the wifiap is cannot be null");

}

Method setupMethod = wifiManager.getClass().getMethod(

SETUP_WIFIAP_METHOD, WifiConfiguration.class, boolean.class);

 

WifiConfiguration netConfig = new WifiConfiguration();

netConfig.SSID = name;

 

netConfig.allowedAuthAlgorithms

.set(WifiConfiguration.AuthAlgorithm.OPEN);

netConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);

netConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);

netConfig.allowedPairwiseCiphers

.set(WifiConfiguration.PairwiseCipher.CCMP);

netConfig.allowedPairwiseCiphers

.set(WifiConfiguration.PairwiseCipher.TKIP);

netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);

netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);

// 开放式

netConfig.allowedKeyManagement.isEmpty();

 

setupMethod.invoke(wifiManager, netConfig, true);

}

}

开启一个热点,需要调用wifiManager的服务,然后配置一个方法Method setupMethod = wifiManager.getClass().getMethod(SETUP_WIFIAP_METHOD, WifiConfiguration.class, boolean.class);方法配置好了之后,需要设置一下你个热点,new一个wifiCOnfiguration()对象出来,然后把相应的设置像设置动态布局一下写好,如果用的是开放式(无密码)的话,那么configuration.allowedKeyManagement方法就可以写isEmpty();设置好了这个之后就是把它们应用到这个方法里面了,setupMethod.invoke(wifiManager, netConfig, true);这个时候开启热点AP的任务就完成了(这个最好放在一个worker工具类里面)。

那么下面就是写连接这个热点AP了。连接的代码也不多,就是你要设置一下wifi的配置.

先上代码:

wifiConfiguration .WifiConfiguration wifiConfig = new WifiConfiguration();

wifiConfig.SSID = String.format("\"%s\"",ssid);

wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);

 

WifiManager wifiManager= (WifiManager) getSystemService(Context.WIFI_SERVICE);

if (!wifiManager.isWifiEnabled()) {

wifiManager.setWifiEnabled(true);

}

wifiManager.addNetwork(wifiConfig);

设置好了之后,调用系统的这个wifiManager管理对象的getCOnfiguredNetwork()方法抓一下当前周围已经存在的wifi,然后用个for循环遍历一下找到这个你开的APSSID名字,然后先断开一下wifi,在重新连接上这个networkId,注意了,这个Id是你的wifiConfigurationnetworkId,类型是int,和他的SSID是同一个层次的参数。然后传给wifiManager这个networkId就好了。这个时候就连上了你自己开启的手机热点。相当于两部手机连接到了同一个局域网LAN里面。

List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();

for (WifiConfiguration i : list) {

if (i.SSID != null && i.SSID.equals("\"" + FileReceInfo.getInstance().ssid + "\"")) {

wifiManager.disconnect();

wifiManager.enableNetwork(i.networkId, true);

wifiManager.reconnect();

isConnected = true;

break;

}

}

5)关于p2p文件传输的研究

关于手机p2p的研究,暂时还没有精深,所以等项目完全结束了在详细的写一下这个吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值