一、背景
我们知道每块网卡(NIC)都有一个固化在硬件存储器中物理地址(或称硬件地址),也就是MAC,这个地址,在出厂上就已经固定,除非是使用可擦写编程器重写,否则是无法变更的。
这里所说的更改网卡的MAC地址,其实是针对操作系统对MAC地址的读取规律,而对OS做出的一种欺骗方法。因为操作系统通常是从硬件网卡读取MAC地址后,再存储在注册表(如windows)、配置文件等之中,以后就直接从这些存储空间读取了。所以可以通过修改这里面的MAC地址,来“更改”网卡的 MAC地址。
之所以摸索ubuntu下更改网卡的地址,乃是因为有些上网服务与MAC地址绑定,这样,如果原先的网卡坏了更换新的而又不想去经历官僚的变更手续,或者是又有台式机又有笔记本的时候,希望在能够在两台机器都上网(同时只能使用一台)的话,那就要考虑使用了。
二、修改MAC地址
1.暂时修改
在ubuntu下更改MAC地址的命令是ifconfig(和windows下的ipconfig还是比较相似的),如果要更改MAC地址,可以新开一个终端,依次使用以下命令:
sudo ifconfig eth0 down(停用网卡)
sudo ifconfig eth0 hw etherXX:XX:XX:XX:XX:XX(需要更改的MAC地址)
sudo ifconfig eth0 up(启用网卡)
然后再用ifconfig查看一下,需要查看ifconfig的各个参数含义,可以用manifconfig查看帮助。
sudo ifconfig eth0(查看eth0网卡信息)
2.永久修改(两种方法)
方法一
以上只是暂时修改mac地址,如果需要每次系统启动后,都自动修改好MAC地址的话,那么可以将以上命令写入启动脚本中,我使用的方法是将它写入/etc/init.d/rc.local的最后。
sudo nano /etc/init.d/rc.local
重启rc.local
sudo /etc/init.d/rc.local start
方法二
直接编辑/etc/network/interfaces文件,在ifaceeth0 inetstatic后面添加一行:
pre-up ifconfigeth0hwetherxx:xx:xx:xx:xx:xx(要改成的MAC)
编辑interfaces文件
sudonano/etc/network/interfaces
如下所示:
faceeth0inetstatic
pre-upifconfigeth0hwetherxx:xx:xx:xx:xx:xx(要改成的MAC)
address192.168.1.10
netmask255.255.255.0
gateway192.168.1.1
重启网卡
sudo /etc/init.d/networking restart
contentprovider的学习实例总结
转自:http://www.cnblogs.com/chenglong/articles/1892029.html
工作中遇到了contentprovider数据共享机制,下面来总结一下:
一、ContentProvider简介
当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。
二、Uri类简介
Uri代表了要操作的数据,Uri主要包含了两部分信息:1.需要操作的ContentProvider ,2.对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:
1.scheme:ContentProvider(内容提供者)的scheme已经由Android所规定为:content://。
2.主机名(或Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
3.路径(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
• 要操作contact表中id为10的记录,可以构建这样的路径:/contact/10
• 要操作contact表中id为10的记录的name字段, contact/10/name
• 要操作contact表中的所有记录,可以构建这样的路径:/contact
要操作的数据不一定来自数据库,也可以是文件等他存储方式,如下:
要操作xml文件中contact节点下的name节点,可以构建这样的路径:/contact/name
如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:
Uri uri = Uri.parse("content://com.changcheng.provider.contactprovider/contact")
三、UriMatcher、ContentUrist和ContentResolver简介
因为Uri代表了要操作的数据,所以我们很经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。掌握它们的使用,会便于我们的开发工作。
UriMatcher:用于匹配Uri,它的用法如下:
1.首先把你需要匹配Uri路径全部给注册上,如下:
//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)。
UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//如果match()方法匹配content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回匹配码为1
uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact”, 1);//添加需要匹配uri,如果匹配就会返回匹配码
//如果match()方法匹配 content://com.changcheng.sqlite.provider.contactprovider/contact/230路径,返回匹配码为2
uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact/#”, 2);//#号为通配符
2.注册完需要匹配的Uri后,就可以使用uriMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用 addURI()方法传入的第三个参数,假设匹配 content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回的匹配码为1。
ContentUris:用于获取Uri路径后面的ID部分,它有两个比较实用的方法:
• withAppendedId(uri, id)用于为路径加上ID部分
• parseId(uri)方法用于从路径中获取ID部分
ContentResolver:当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用 ContentResolver 类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法,来操作数据。
四、ContentProvider示例程序
Manifest.xml中的代码:
需要在<application></application>中为provider进行注册!!!!
首先定义一个数据库的工具类:
最后创建测试类:
注:上面是在一个程序中进行的测试,也可以再新建一个工程来模拟一个新的程序,然后将上面查询的代码加到新的程序当中!这样就模拟了contentprovider的数据共享功能了!
新建个工程:TestProvider
创建一个测试的activity
注:新建的程序中的manifest.xml中不需要对provider进行注册,直接运行就行,否则会报错!
Activity生命周期之我见
http://www.cnblogs.com/kofi1122/archive/2011/04/10/2011772.html
关于Activity生命周期的文章很多,而且大部分也说得很详细,所以作为关于这方面的内容我本来不想多说,但是大家可能跟我之前一样,在看这方面的内容的时候都能很容易地看懂,但是过几天又忘了,或者在用的程序中跳转较多的情况下容易混淆。
这是因为没有真正的理解,或者是没有很好的方法来记忆,所以在这里我就说一下我对Activity生命周期的一些记忆的方式,希望对大家能够有所帮助。
Activity生命周期的基本内容我就不多说了,网上一搜一大把,官方文档也说得很详细。总之,我们知道Activity从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应的回调方法,这些回调方法包括:
onCreate 、onStart 、onResume 、onPause 、onStop 、onDestroy 、onRestart
下面这张图就是我的记忆的方式:
不难看出,其实这些方法都是两两对应的,onCreate创建与onDestroy销毁;onStart可见与onStop不可 见;onResume可编辑(即焦点)与onPause;这6个方法是相对应的,那么就只剩下一个onRestart方法了,这个方法在什么时候调用呢? 答案就是:在Activity被onStop后,但是没有被onDestroy,在再次启动此Activity时就调用onRestart(而不再调用 onCreate)方法;如果被onDestroy了,则是调用onCreate方法。
这样大家就应该能够很容易的记住这些方法了。下面再通过一个比喻来看两个Activity的切换过程。
我们把Activity比作一本书,我们要看书,首先从书架上取出书(onCreate),然后放到桌上(onStart),接着打开书(onResume),这样我们就可以看书并可以在书本上写字了。
如果这时候我们要启动另一个Activity,也就是要看另一本书,首先我们放下手中的笔或者说合上书(onPause),然后从书架上拿下另一本书(书2:onCreate),然后把书本2放到桌上并打开(书2:onStart、onResume)。
如果书本1被书本2完全盖住了,即不可见了,就调用书本1的onStop;而如果书本2较小,没有完全盖住书本1,则不会调用。
我们还可以把书本1放回书架上,即onDestroy。
另外,还有一点要注意,Activity在处于onPause、onStop、onDestroy状态下,系统都可以销毁该Activity所在进程,所以我们在处理一些要保存的数据时,必须在onPause方法中进行 ,因为onStop和onDestroy方法不一定会被调用。
OK,就说这么多……