当前位置:  编程技术>移动开发
本页文章导读:
    ▪ubuntu 9.04上批改网卡mac地址(转载)        ubuntu 9.04上修改网卡mac地址(转载) 一、背景我们知道每块网卡(NIC)都有一个固化在硬件存储器中物理地址(或称硬件地址),也就是MAC,这个地址,在出厂上就已经固定,除非是使用可.........
    ▪ contentprovider的学习范例总结        contentprovider的学习实例总结 contentprovider的学习实例总结 转自:http://www.cnblogs.com/chenglong/articles/1892029.html   工作中遇到了contentprovider数据共享机制,下面来总结一下:一、ContentProvider简介.........
    ▪ Activity生命周期之小弟我见(转)       Activity生命周期之我见(转) Activity生命周期之我见 http://www.cnblogs.com/kofi1122/archive/2011/04/10/2011772.html   关于Activity生命周期的文章很多,而且大部分也说得很详细,所以作为关于这方面的内容.........

[1]ubuntu 9.04上批改网卡mac地址(转载)
    来源: 互联网  发布时间: 2014-02-18
ubuntu 9.04上修改网卡mac地址(转载)

一、背景
我们知道每块网卡(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

    
[2] contentprovider的学习范例总结
    来源: 互联网  发布时间: 2014-02-18
contentprovider的学习实例总结
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中的代码:

 

01 <application android:icon="@drawable/icon" android:label="@string/app_name">
02                 <activity android:name=".TestWebviewDemo" android:label="@string/app_name">
03                         <intent-filter>
04                                 <action android:name="android.intent.action.MAIN" />
05                                 <category android:name="android.intent.category.LAUNCHER" />
06                         </intent-filter>
07                         <intent-filter>
08                                 <data android:mimeType="vnd.android.cursor.dir/vnd.ruixin.login" />
09                         </intent-filter>
10                         <intent-filter>
11                                 <data android:mimeType="vnd.android.cursor.item/vnd.ruixin.login" />
12                         </intent-filter>
13                          
14                 </activity>
15                 <provider android:name="MyProvider" android:authorities="com.ruixin.login" />
16         </application>

需要在<application></application>中为provider进行注册!!!!
首先定义一个数据库的工具类:

01 public class RuiXin {
02  
03         public static final String DBNAME = "ruixinonlinedb";
04         public static final String TNAME = "ruixinonline";
05         public static final int VERSION = 3;
06          
07         public static String TID = "tid";
08         public static final String EMAIL = "email";
09         public static final String USERNAME = "username";
10         public static final String DATE = "date";
11         public static final String SEX = "sex";
12          
13          
14         public static final String AUTOHORITY = "com.ruixin.login";
15         public static final int ITEM = 1;
16         public static final int ITEM_ID = 2;
17          
18         public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.ruixin.login";
19         public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.ruixin.login";
20          
21         public static final Uri CONTENT_URI = Uri.parse("content://" + AUTOHORITY + "/ruixinonline");
22 }

 

  • 然后创建一个数据库:
    01 public class DBlite extends SQLiteOpenHelper {
    02         public DBlite(Context context) {
    03                 super(context, RuiXin.DBNAME, null, RuiXin.VERSION);
    04                 // TODO Auto-generated constructor stub
    05         }
    06         @Override
    07         public void onCreate(SQLiteDatabase db) {
    08                 // TODO Auto-generated method stub
    09                         db.execSQL("create table "+RuiXin.TNAME+"(" +
    10                                 RuiXin.TID+" integer primary key autoincrement not null,"+
    11                                 RuiXin.EMAIL+" text not null," +
    12                                 RuiXin.USERNAME+" text not null," +
    13                                 RuiXin.DATE+" interger not null,"+
    14                                 RuiXin.SEX+" text not null);");
    15         }
    16         @Override
    17         public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    18                 // TODO Auto-generated method stub
    19         }
    20         public void add(String email,String username,String date,String sex){
    21                 SQLiteDatabase db = getWritableDatabase();
    22                 ContentValues values = new ContentValues();
    23                 values.put(RuiXin.EMAIL, email);
    24                 values.put(RuiXin.USERNAME, username);
    25                 values.put(RuiXin.DATE, date);
    26                 values.put(RuiXin.SEX, sex);
    27                 db.insert(RuiXin.TNAME,"",values);
    28         }
    29 }
  • 接着创建一个Myprovider.java对数据库的接口进行包装:
    001 public class MyProvider extends ContentProvider{
    002  
    003         DBlite dBlite;
    004         SQLiteDatabase db;
    005          
    006         private static final UriMatcher sMatcher;
    007         static{
    008                 sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    009                 sMatcher.addURI(RuiXin.AUTOHORITY,RuiXin.TNAME, RuiXin.ITEM);
    010                 sMatcher.addURI(RuiXin.AUTOHORITY, RuiXin.TNAME+"/#", RuiXin.ITEM_ID);
    011  
    012         }
    013         @Override
    014         public int delete(Uri uri, String selection, String[] selectionArgs) {
    015                 // TODO Auto-generated method stub
    016                 db = dBlite.getWritableDatabase();
    017                 int count = 0;
    018                 switch (sMatcher.match(uri)) {
    019                 case RuiXin.ITEM:
    020                         count = db.delete(RuiXin.TNAME,selection, selectionArgs);
    021                         break;
    022                 case RuiXin.ITEM_ID:
    023                         String id = uri.getPathSegments().get(1);
    024                         count = db.delete(RuiXin.TID, RuiXin.TID+"="+id+(!TextUtils.isEmpty(RuiXin.TID="?")?"AND("+selection+')':""), selectionArgs);
    025                     break;
    026                 default:
    027                         throw new IllegalArgumentException("Unknown URI"+uri);
    028                 }
    029                 getContext().getContentResolver().notifyChange(uri, null);
    030                 return count;
    031         }
    032  
    033         @Override
    034         public String getType(Uri uri) {
    035                 // TODO Auto-generated method stub
    036                 switch (sMatcher.match(uri)) {
    037                 case RuiXin.ITEM:
    038                         return RuiXin.CONTENT_TYPE;
    039                 case RuiXin.ITEM_ID:
    040                     return RuiXin.CONTENT_ITEM_TYPE;
    041                 default:
    042                         throw new IllegalArgumentException("Unknown URI"+uri);
    043                 }
    044         }
    045  
    046         @Override
    047         public Uri insert(Uri uri, ContentValues values) {
    048                 // TODO Auto-generated method stub
    049                  
    050                 db = dBlite.getWritableDatabase();
    051                 long rowId;
    052                 if(sMatcher.match(uri)!=RuiXin.ITEM){
    053                         throw new IllegalArgumentException("Unknown URI"+uri);
    054                 }
    055                 rowId = db.insert(RuiXin.TNAME,RuiXin.TID,values);
    056                    if(rowId>0){
    057                            Uri noteUri=ContentUris.withAppendedId(RuiXin.CONTENT_URI, rowId);
    058                            getContext().getContentResolver().notifyChange(noteUri, null);
    059                            return noteUri;
    060                    }
    061                    throw new IllegalArgumentException("Unknown URI"+uri);
    062         }
    063  
    064         @Override
    065         public boolean onCreate() {
    066                 // TODO Auto-generated method stub
    067                 this.dBlite = new DBlite(this.getContext());
    068 //                db = dBlite.getWritableDatabase();
    069 //                return (db == null)?false:true;
    070                 return true;
    071         }
    072  
    073         @Override
    074         public Cursor query(Uri uri, String[] projection, String selection,
    075                         String[] selectionArgs, String sortOrder) {
    076                 // TODO Auto-generated method stub
    077                 db = dBlite.getWritableDatabase();               
    078                 Cursor c;
    079                 Log.d("-------", String.valueOf(sMatcher.match(uri)));
    080                 switch (sMatcher.match(uri)) {
    081                 case RuiXin.ITEM:
    082                         c = db.query(RuiXin.TNAME, projection, selection, selectionArgs, null, null, null);
    083                  
    084                         break;
    085                 case RuiXin.ITEM_ID:
    086                         String id = uri.getPathSegments().get(1);
    087                         c = db.query(RuiXin.TNAME, projection, RuiXin.TID+"="+id+(!TextUtils.isEmpty(selection)?"AND("+selection+')':""),selectionArgs, null, null, sortOrder);
    088                     break;
    089                 default:
    090                         Log.d("!!!!!!", "Unknown URI"+uri);
    091                         throw new IllegalArgumentException("Unknown URI"+uri);
    092                 }
    093                 c.setNotificationUri(getContext().getContentResolver(), uri);
    094                 return c;
    095         }
    096         @Override
    097         public int update(Uri uri, ContentValues values, String selection,
    098                         String[] selectionArgs) {
    099                 // TODO Auto-generated method stub
    100                 return 0;
    101         }
    102 }


    最后创建测试类:
    01 public class Test extends Activity {
    02     /** Called when the activity is first created. */
    03    private DBlite dBlite1 = new DBlite(this);;
    04         private ContentResolver contentResolver;
    05                     public void onCreate(Bundle savedInstanceState) {
    06                 super.onCreate(savedInstanceState);
    07                 setContentView(R.layout.main);
    08                 //先对数据库进行添加数据
    09             dBlite1.add(email,username,date,sex);
    10             //通过contentResolver进行查找
    11              contentResolver = TestWebviewDemo.this.getContentResolver();
    12             Cursor cursor = contentResolver.query(
    13                   RuiXin.CONTENT_URI, new String[] {
    14                   RuiXin.EMAIL, RuiXin.USERNAME,
    15                   RuiXin.DATE,RuiXin.SEX }, null, null, null);
    16                 while (cursor.moveToNext()) {
    17                      Toast.makeText(
    18                     TestWebviewDemo.this,
    19                     cursor.getString(cursor.getColumnIndex(RuiXin.EMAIL))
    20                             + " "
    21                             + cursor.getString(cursor.getColumnIndex(RuiXin.USERNAME))
    22                             + " "
    23                             + cursor.getString(cursor.getColumnIndex(RuiXin.DATE))
    24                             + " "
    25                             + cursor.getString(cursor.getColumnIndex(RuiXin.SEX)),
    26                            Toast.LENGTH_SHORT).show();
    27                      }
    28                    startManagingCursor(cursor);  //查找后关闭游标
    29             }
    30         }

    注:上面是在一个程序中进行的测试,也可以再新建一个工程来模拟一个新的程序,然后将上面查询的代码加到新的程序当中!这样就模拟了contentprovider的数据共享功能了!
    新建个工程:TestProvider
    创建一个测试的activity
    01 public class Test extends Activity {
    02     /** Called when the activity is first created. */
    03         private ContentResolver contentResolver;
    04                     public void onCreate(Bundle savedInstanceState) {
    05                 super.onCreate(savedInstanceState);
    06                 setContentView(R.layout.main);
    07                
    08             //通过contentResolver进行查找
    09               contentResolver = TestWebviewDemo.this.getContentResolver();                    
    10              Cursor cursor = contentResolver.query(
    11                 RuiXin.CONTENT_URI, new String[] {
    12                 RuiXin.EMAIL, RuiXin.USERNAME,
    13                 RuiXin.DATE,RuiXin.SEX }, null, null, null);
    14             while (cursor.moveToNext()) {
    15                Toast.makeText(TestWebviewDemo.this,
    16                        cursor.getString(cursor.getColumnIndex(RuiXin.EMAIL))
    17                        + " "
    18                        + cursor.getString(cursor.getColumnIndex(RuiXin.USERNAME))
    19                        + " "
    20                        + cursor.getString(cursor.getColumnIndex(RuiXin.DATE))
    21                        + " "
    22                        + cursor.getString(cursor.getColumnIndex(RuiXin.SEX)),
    23                        Toast.LENGTH_SHORT).show();
    24                    }
    25                    startManagingCursor(cursor);  //查找后关闭游标
    26             }
    27         }
    运行此程序就能实现共享数据查询了!

    注:新建的程序中的manifest.xml中不需要对provider进行注册,直接运行就行,否则会报错!

  •     
    [3] Activity生命周期之小弟我见(转)
        来源: 互联网  发布时间: 2014-02-18
    Activity生命周期之我见(转)
    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,就说这么多……


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3