当前位置:  编程技术>移动开发
本页文章导读:
    ▪loadApp 点击使用的图标启动该应用实现的原理        loadApp 点击应用的图标启动该应用实现的原理 import java.util.ArrayList; import android.net.Uri; import android.content.ComponentName; import android.content.pm.PackageManager; import android.view.LayoutInflater; import android.view.Vi.........
    ▪ ContentObsever种浅析        ContentObsever类浅析 ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于    数据库技术中的触发器(Trigger),当ContentObserver所观察的Ur.........
    ▪ cts测试用例 test_getInstance_invalid_locale 失败原因及解决办法       cts测试用例 test_getInstance_invalid_locale 失败原因及解决方法 cts测试中,测试test_getInstance_invalid_locale失败的详细log如下:   cts-tf > run cts -c libcore.java.text.DateFormatSymbolsTest -m test_getInstance_invalid_.........

[1]loadApp 点击使用的图标启动该应用实现的原理
    来源: 互联网  发布时间: 2014-02-18
loadApp 点击应用的图标启动该应用实现的原理
package com.example.loadapp;
 
import java.util.ArrayList;
import java.util.List;
 
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.TextView;
 
public class MainActivity extends Activity
{
 
    private List<ResolveInfo> list;
    private ListAdapter adapter=new BaseAdapter()
    {
        
        @Override
        public View getView(int position, View convertView, ViewGroup parent)
        {
            LayoutInflater inflater = getLayoutInflater();
            LinearLayout linearLayout = (LinearLayout)inflater.inflate(R.layout.item, null);
            ImageView imageView = (ImageView)linearLayout.findViewById(R.id.imageView1);
            TextView textView = (TextView)linearLayout.findViewById(R.id.textView1);
           // imageView.setLayoutParams(new AbsListView.LayoutParams(96,96));
            APP app = APPlist.get(position);
            imageView.setImageDrawable(app.getIcon());
             textView.setText(app.getLabel());
            return linearLayout;
        }
        
        @Override
        public long getItemId(int position)
        {
            // TODO Auto-generated method stub
            return 0;
        }
        
        @Override
        public Object getItem(int position)
        {
            // TODO Auto-generated method stub
            return null;
        }
        
        @Override
        public int getCount()
        {
            return APPlist.size();
        }
    };
    private ArrayList<APP> APPlist;
   
 
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        GridView gridView =(GridView) findViewById(R.id.gridView1);
         APPlist = new ArrayList<APP>();
        PackageManager packageManager = getPackageManager();
        Intent intent=new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        list = packageManager.queryIntentActivities(intent, 0);
        for (int i = 0; i <list.size(); i++)
        {
           ActivityInfo activityInfo = list.get(i).activityInfo;
        Drawable icon = activityInfo.loadIcon(getPackageManager());
           CharSequence label = activityInfo.loadLabel(getPackageManager());
           String packagename=activityInfo.packageName;
           //android:name  就是該activity的類名
           //android:name  就是該activity的類名
           //android:name  就是該activity的類名
           String itemname=activityInfo.name;
           
          APP app = new APP(icon,label,packagename,itemname); 
          APPlist.add(app);
        }
        gridView.setAdapter(adapter);
        gridView.setOnItemClickListener(new OnItemClickListener()
        {
 
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id)
            {
                     
                Intent intent002 = new Intent(Intent.ACTION_MAIN);
                intent002.addCategory(Intent.CATEGORY_LAUNCHER);
                APP app = APPlist.get(position);
                intent002.setPackage(app.getPackagename());
                //return   intent  該方法是非常的重要和有用
                //return   intent  該方法是非常的重要和有用
                //return   intent  該方法是非常的重要和有用
                //return   intent  該方法是非常的重要和有用
                intent002.setComponent(new ComponentName(app.getPackagename(), app.getItemname()));
                startActivity(intent002);            
            }
        });
        
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
 
}
///////////////////////////////////////////////app的详细信息
package com.example.loadapp;
 
import android.graphics.drawable.Drawable;
 
public class APP
{
 
    private Drawable icon;
    private CharSequence label;
    private String packagename;
    private String itemname;
 
    public APP(Drawable icon, CharSequence label, String packagename, String itemname)
    {
        this.icon=icon;
        this.label=label;
        this.packagename=packagename;
        this.itemname=itemname;
    }
 
    /**
     * @return  就是包中要啟動的類 的  類名
     */
    public String getItemname()
    {
        return itemname;
    }
 
    /**
     * @param itemname  就 是包中要啟動的類的 類名
     */
    public void setItemname(String itemname)
    {
        this.itemname = itemname;
    }
 
    public String getPackagename()
    {
        return packagename;
    }
 
    public void setPackagename(String classname)
    {
        this.packagename = classname;
    }
 
    public Drawable getIcon()
    {
        return icon;
    }
 
    public void setIcon(Drawable icon)
    {
        this.icon = icon;
    }
 
    public CharSequence getLabel()
    {
        return label;
    }
 
    public void setLabel(CharSequence label)
    {
        this.label = label;
    }
    
 
}

    
[2] ContentObsever种浅析
    来源: 互联网  发布时间: 2014-02-18
ContentObsever类浅析

ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于
   数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。触发器分为表触发器、行触发器,
  相应地ContentObserver也分为“表“ContentObserver、“行”ContentObserver,当然这是与它所监听的Uri MIME Type有关的。
 
           熟悉Content Provider(内容提供者)的应该知道,我们可以通过UriMatcher类注册不同类型的Uri,我们可以通过这些不同的
    Uri来查询不同的结果。根据Uri返回的结果,Uri Type可以分为:返回多条数据的Uri、返回单条数据的Uri。
 
 
  注册/取消注册ContentObserver方法,抽象类ContentResolver类中的方法原型如下:
 
    public final void registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)
             功能:为指定的Uri注册一个ContentObserver派生类实例,当给定的Uri发生改变时,回调该实例对象去处理。
             参数:uri          需要观察的Uri(需要在UriMatcher里注册,否则该Uri也没有意义了)
                        notifyForDescendents  为false 表示精确匹配,即只匹配该Uri
                                                                     为true 表示可以同时匹配其派生的Uri,举例如下:
                          假设UriMatcher 里注册的Uri共有一下类型:
                                1 、content://com.qin.cb/student (学生)
                                2 、content://com.qin.cb/student/#
                                3、 content://com.qin.cb/student/schoolchild(小学生,派生的Uri)
 
                    假设我们当前需要观察的Uri为content://com.qin.cb/student,如果发生数据变化的 Uri 为  
           content://com.qin.cb/student/schoolchild ,当notifyForDescendents为 false,那么该ContentObserver会监听不到, 
           但是当notifyForDescendents 为ture,能捕捉该Uri的数据库变化。
 
                     observer       ContentObserver的派生类实例
 
 
    public final void  unregisterContentObserver(ContentObserver observer)
          功能:取消对给定Uri的观察
          参数: observer ContentObserver的派生类实例
 
       
ContentObserver类介绍
 
  构造方法 public void ContentObserver(Handler handler) 
                       说明:所有   ContentObserver的派生类都需要调用该构造方法
        参数: handler  Handler对象。可以是主线程Handler(这时候可以更新UI 了),也可以是任何Handler对象。
 常用方法
   void onChange(boolean selfChange)
       功能:当观察到的Uri发生变化时,回调该方法去处理。所有ContentObserver的派生类都需要重载该方法去处理逻辑。
       参数:selfChange 回调后,其值一般为false,该参数意义不大(我也不懂,理解方法最重要)。
 
  另外两个方法,用处不大,我也不懂,大家参照SDK自行理解,冒昧了。
  boolean  deliverSelfNotifications()
     说明:Returns true if this observer is interested in notifications for changes made through the cursor the observer is registered with.
 
  final void dispatchChange(boolean selfChange)
 
 
  观察特定Uri的步骤如下:
 
     1、    创建我们特定的ContentObserver派生类,必须重载父类构造方法,必须重载onChange()方法去处理回调后的功能实现
     2、    利用context.getContentResolover()获得ContentResolove对象,接着调用registerContentObserver()方法去注册内容观察者
     3、    由于ContentObserver的生命周期不同步于Activity和Service等,因此,在不需要时,需要手动的调用
             unregisterContentObserver()去取消注册。   
 
 
 
好了,基本讲解就介绍到这儿了。下面给出小DEMO的简单说明:
     Demo中共有两个不同的ContentObserver派生类,如下:
        1、用来观察系统是否改变了飞行模式状态,
          PS: 大家可以去SDK中查看该类:android.provider.Settings.System。该类封装了对设置模块下所有值的存取,比如:
          飞行模式状态、蓝牙状态、屏幕亮度值等,并且提供了相应的Uri。
        2、观察系统的短信息数据发生了变化。当监听到短信数据发生变化时,查询所有已发送的短信并且显示出来。
 
   短信的Uri共有一下几种:
                         content://sms/inbox     收件箱        
                         content://sms/sent        已发送
                         content://sms/draft        草稿          
                         content://sms/outbox    发件箱           (正在发送的信息)
                         content://sms/failed      发送失败    
                         content://sms/queued  待发送列表  (比如开启飞行模式后,该短信就在待发送列表里)


 
DEMO文件如下:
1、 观察飞行模式状态的ContentObserver派生类,AirplaneContentObserver.java

 

[java] view plaincopyprint?
  • package com.qin.contentobserver;    
  •     
  • import android.content.Context;    
  • import android.database.ContentObserver;    
  • import android.net.Uri;    
  • import android.os.Handler;    
  • import android.provider.*;    
  • import android.provider.Settings.SettingNotFoundException;    
  • import android.util.Log;    
  •     
  •     
  • //用来观察system表里飞行模式所在行是否发生变化 , “行”内容观察者    
  • public class AirplaneContentObserver extends ContentObserver {    
  •     
  •     private static String TAG = "AirplaneContentObserver" ;    
  •         
  •     private static int MSG_AIRPLANE = 1 ;    
  •         
  •     private Context mContext;        
  •     private Handler mHandler ;  //此Handler用来更新UI线程    
  •         
  •     public AirplaneContentObserver(Context context, Handler handler) {    
  •         super(handler);    
  •         mContext = context;    
  •         mHandler = handler ;    
  •     }    
  •     
  •     /**  
  •      * 当所监听的Uri发生改变时,就会回调此方法  
  •      *   
  •      * @param selfChange 此值意义不大 一般情况下该回调值false  
  •      */    
  •     @Override    
  •     public void onChange(boolean selfChange) {    
  •         Log.i(TAG, "-------------the airplane mode has changed-------------");    
  •             
  •         // 系统是否处于飞行模式下    
  •         try {    
  •             int isAirplaneOpen = Settings.System.getInt(mContext.getContentResolver(), Settings.System.AIRPLANE_MODE_ON);    
  •             Log.i(TAG, " isAirplaneOpen -----> " +isAirplaneOpen) ;    
  •             mHandler.obtainMessage(MSG_AIRPLANE,isAirplaneOpen).sendToTarget() ;    
  •         }    
  •         catch (SettingNotFoundException e) {    
  •             // TODO Auto-generated catch block    
  •             e.printStackTrace();    
  •         }    
  •     
  •     }    
  •     
  • }    
  • package com.qin.contentobserver;  
      
    import android.content.Context;  
    import android.database.ContentObserver;  
    import android.net.Uri;  
    import android.os.Handler;  
    import android.provider.*;  
    import android.provider.Settings.SettingNotFoundException;  
    import android.util.Log;  
      
      
    //用来观察system表里飞行模式所在行是否发生变化 , “行”内容观察者  
    public class AirplaneContentObserver extends ContentObserver {  
      
        private static String TAG = "AirplaneContentObserver" ;  
          
        private static int MSG_AIRPLANE = 1 ;  
          
        private Context mContext;      
        private Handler mHandler ;  //此Handler用来更新UI线程  
          
        public AirplaneContentObserver(Context context, Handler handler) {  
            super(handler);  
            mContext = context;  
            mHandler = handler ;  
        }  
      
        /** 
         * 当所监听的Uri发生改变时,就会回调此方法 
         *  
         * @param selfChange 此值意义不大 一般情况下该回调值false 
         */  
        @Override  
        public void onChange(boolean selfChange) {  
            Log.i(TAG, "-------------the airplane mode has changed-------------");  
              
            // 系统是否处于飞行模式下  
            try {  
                int isAirplaneOpen = Settings.System.getInt(mContext.getContentResolver(), Settings.System.AIRPLANE_MODE_ON);  
                Log.i(TAG, " isAirplaneOpen -----> " +isAirplaneOpen) ;  
                mHandler.obtainMessage(MSG_AIRPLANE,isAirplaneOpen).sendToTarget() ;  
            }  
            catch (SettingNotFoundException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
      
        }  
      
    }  


    2、观察系统里短消息的数据库变化的ContentObserver派生类,SMSContentObserver.java

    [java] view plaincopyprint?
  • package com.qin.contentobserver;    
  •     
  • import android.content.Context;    
  • import android.database.ContentObserver;    
  • import android.database.Cursor;    
  • import android.net.Uri;    
  • import android.os.Handler;    
  • import android.util.Log;    
  •     
  •     
  • //用来观察系统里短消息的数据库变化  ”表“内容观察者,只要信息数据库发生变化,都会触发该ContentObserver 派生类    
  • public class SMSContentObserver extends ContentObserver {    
  •     private static String TAG = "SMSContentObserver";    
  •         
  •     private int MSG_OUTBOXCONTENT = 2 ;    
  •         
  •     private Context mContext  ;    
  •     private Handler mHandler ;   //更新UI线程    
  •         
  •     public SMSContentObserver(Context context,Handler handler) {    
  •         super(handler);    
  •         mContext = context ;    
  •         mHandler = handler ;    
  •     }    
  •     /**  
  •      * 当所监听的Uri发生改变时,就会回调此方法  
  •      *   
  •      * @param selfChange  此值意义不大 一般情况下该回调值false  
  •      */    
  •     @Override    
  •     public void onChange(boolean selfChange){    
  •         Log.i(TAG, "the sms table has changed");    
  •             
  •         //查询发件箱里的内容         
  •         Uri outSMSUri = Uri.parse("content://sms/sent") ;    
  •             
  •         Cursor c = mContext.getContentResolver().query(outSMSUri, null, null, null,"date desc");    
  •         if(c != null){    
  •                 
  •             Log.i(TAG, "the number of send is"+c.getCount()) ;    
  •                 
  •             StringBuilder sb = new StringBuilder() ;    
  •             //循环遍历    
  •             while(c.moveToNext()){    
  • //              sb.append("发件人手机号码: "+c.getInt(c.getColumnIndex("address")))    
  • //                .append("信息内容: "+c.getInt(c.getColumnIndex("body")))    
  • //                .append("是否查看: "+c.getInt(c.getColumnIndex("read")))     
  • //                .append("发送时间: "+c.getInt(c.getColumnIndex("date")))    
  • //                .append("\n");    
  •                 sb.append("发件人手机号码: "+c.getInt(c.getColumnIndex("address")))    
  •                   .append("信息内容: "+c.getString(c.getColumnIndex("body")))    
  •                   .append("\n");    
  •             }    
  •             c.close();              
  •             mHandler.obtainMessage(MSG_OUTBOXCONTENT, sb.toString()).sendToTarget();            
  •         }    
  •     }    
  •         
  • }    
  • package com.qin.contentobserver;  
      
    import android.content.Context;  
    import android.database.ContentObserver;  
    import android.database.Cursor;  
    import android.net.Uri;  
    import android.os.Handler;  
    import android.util.Log;  
      
      
    //用来观察系统里短消息的数据库变化  ”表“内容观察者,只要信息数据库发生变化,都会触发该ContentObserver 派生类  
    public class SMSContentObserver extends ContentObserver {  
        private static String TAG = "SMSContentObserver";  
          
        private int MSG_OUTBOXCONTENT = 2 ;  
          
        private Context mContext  ;  
        private Handler mHandler ;   //更新UI线程  
          
        public SMSContentObserver(Context context,Handler handler) {  
            super(handler);  
            mContext = context ;  
            mHandler = handler ;  
        }  
        /** 
         * 当所监听的Uri发生改变时,就会回调此方法 
         *  
         * @param selfChange  此值意义不大 一般情况下该回调值false 
         */  
        @Override  
        public void onChange(boolean selfChange){  
            Log.i(TAG, "the sms table has changed");  
              
            //查询发件箱里的内容       
            Uri outSMSUri = Uri.parse("content://sms/sent") ;  
              
            Cursor c = mContext.getContentResolver().query(outSMSUri, null, null, null,"date desc");  
            if(c != null){  
                  
                Log.i(TAG, "the number of send is"+c.getCount()) ;  
                  
                StringBuilder sb = new StringBuilder() ;  
                //循环遍历  
                while(c.moveToNext()){  
    //              sb.append("发件人手机号码: "+c.getInt(c.getColumnIndex("address")))  
    //                .append("信息内容: "+c.getInt(c.getColumnIndex("body")))  
    //                .append("是否查看: "+c.getInt(c.getColumnIndex("read")))   
    //                .append("发送时间: "+c.getInt(c.getColumnIndex("date")))  
    //                .append("\n");  
                    sb.append("发件人手机号码: "+c.getInt(c.getColumnIndex("address")))  
                      .append("信息内容: "+c.getString(c.getColumnIndex("body")))  
                      .append("\n");  
                }  
                c.close();            
                mHandler.obtainMessage(MSG_OUTBOXCONTENT, sb.toString()).sendToTarget();          
            }  
        }  
          
    }  


    3、主工程逻辑为MainActivity.java,对短消息的观察Uri,通过测试我发现只能监听此Uri “content://sms” (等同于"content://sms/"),而不能监听其他的Uri,比如"content://sms/outbox"等。

    [java] view plaincopyprint?
  • package com.qin.contentobserver;    
  •     
  • import android.app.Activity;    
  • import android.database.Cursor;    
  • import android.net.Uri;    
  • import android.os.Bundle;    
  • import android.os.Handler;    
  • import android.os.Message;    
  • import android.provider.*;    
  • import android.util.Log;    
  • import android.widget.EditText;    
  • import android.widget.TextView;    
  •     
  • public class MainActivity extends Activity {    
  •     
  •     private TextView tvAirplane;    
  •     private EditText etSmsoutbox;    
  •     
  •     // Message 类型值    
  •     private static final int MSG_AIRPLANE = 1;    
  •     private static final int MSG_OUTBOXCONTENT = 2;    
  •     
  •     private AirplaneContentObserver airplaneCO;    
  •     private SMSContentObserver smsContentObserver;    
  •     
  •     /** Called when the activity is first created. */    
  •     @Override    
  •     public void onCreate(Bundle savedInstanceState) {    
  •         super.onCreate(savedInstanceState);    
  •         setContentView(R.layout.main);    
  •     
  •         tvAirplane = (TextView) findViewById(R.id.tvAirplane);    
  •         etSmsoutbox = (EditText) findViewById(R.id.smsoutboxContent);    
  •     
  •         // 创建两个对象    
  •         airplaneCO = new AirplaneContentObserver(this, mHandler);    
  •         smsContentObserver = new SMSContentObserver(this, mHandler);    
  •             
  •         //注册内容观察者    
  •         registerContentObservers() ;    
  •     }    
  •     
  •     private void registerContentObservers() {    
  •         // 通过调用getUriFor 方法获得 system表里的"飞行模式"所在行的Uri    
  •         Uri airplaneUri = Settings.System.getUriFor(Settings.System.AIRPLANE_MODE_ON);    
  •         // 注册内容观察者    
  •         getContentResolver().registerContentObserver(airplaneUri, false, airplaneCO);    
  •         // ”表“内容观察者 ,通过测试我发现只能监听此Uri -----> content://sms    
  •         // 监听不到其他的Uri 比如说 content://sms/outbox    
  •         Uri smsUri = Uri.parse("content://sms");    
  •         getContentResolver().registerContentObserver(smsUri, true,smsContentObserver);    
  •     }    
  •     
  •     private Handler mHandler = new Handler() {    
  •     
  •         public void handleMessage(Message msg) {    
  •                 
  •             System.out.println("---mHanlder----");    
  •             switch (msg.what) {    
  •             case MSG_AIRPLANE:    
  •                 int isAirplaneOpen = (Integer) msg.obj;    
  •                 if (isAirplaneOpen != 0)    
  •                     tvAirplane.setText("飞行模式已打开");    
  •                 else if (isAirplaneOpen == 0)    
  •                     tvAirplane.setText("飞行模式已关闭");    
  •                 break;    
  •             case MSG_OUTBOXCONTENT:    
  •                 String outbox = (String) msg.obj;    
  •                 etSmsoutbox.setText(outbox);    
  •                 break;    
  •             default:    
  •                 break;    
  •             }    
  •         }    
  •     };    
  • }    
  • package com.qin.contentobserver;  
      
    import android.app.Activity;  
    import android.database.Cursor;  
    import android.net.Uri;  
    import android.os.Bundle;  
    import android.os.Handler;  
    import android.os.Message;  
    import android.provider.*;  
    import android.util.Log;  
    import android.widget.EditText;  
    import android.widget.TextView;  
      
    public class MainActivity extends Activity {  
      
        private TextView tvAirplane;  
        private EditText etSmsoutbox;  
      
        // Message 类型值  
        private static final int MSG_AIRPLANE = 1;  
        private static final int MSG_OUTBOXCONTENT = 2;  
      
        private AirplaneContentObserver airplaneCO;  
        private SMSContentObserver smsContentObserver;  
      
        /** Called when the activity is first created. */  
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
      
            tvAirplane = (TextView) findViewById(R.id.tvAirplane);  
            etSmsoutbox = (EditText) findViewById(R.id.smsoutboxContent);  
      
            // 创建两个对象  
            airplaneCO = new AirplaneContentObserver(this, mHandler);  
            smsContentObserver = new SMSContentObserver(this, mHandler);  
              
            //注册内容观察者  
            registerContentObservers() ;  
        }  
      
        private void registerContentObservers() {  
            // 通过调用getUriFor 方法获得 system表里的"飞行模式"所在行的Uri  
            Uri airplaneUri = Settings.System.getUriFor(Settings.System.AIRPLANE_MODE_ON);  
            // 注册内容观察者  
            getContentResolver().registerContentObserver(airplaneUri, false, airplaneCO);  
            // ”表“内容观察者 ,通过测试我发现只能监听此Uri -----> content://sms  
            // 监听不到其他的Uri 比如说 content://sms/outbox  
            Uri smsUri = Uri.parse("content://sms");  
            getContentResolver().registerContentObserver(smsUri, true,smsContentObserver);  
        }  
      
        private Handler mHandler = new Handler() {  
      
            public void handleMessage(Message msg) {  
                  
                System.out.println("---mHanlder----");  
                switch (msg.what) {  
                case MSG_AIRPLANE:  
                    int isAirplaneOpen = (Integer) msg.obj;  
                    if (isAirplaneOpen != 0)  
                        tvAirplane.setText("飞行模式已打开");  
                    else if (isAirplaneOpen == 0)  
                        tvAirplane.setText("飞行模式已关闭");  
                    break;  
                case MSG_OUTBOXCONTENT:  
                    String outbox = (String) msg.obj;  
                    etSmsoutbox.setText(outbox);  
                    break;  
                default:  
                    break;  
                }  
            }  
        };  
    }  


     

     

    在此基础上,你可以利用ContentObserver去实现短信黑名单以及悄悄发送短信等技巧,具体可以参考我博客中:

                    Android使用ContentObserver监听数据库变化

     

     总结: 使用ContentObserver的情况主要有一下两者情况:

                  1、需要频繁检测的数据库或者某个数据是否发生改变,如果使用线程去操作,很不经济而且很耗时 ;

                  2、在用户不知晓的情况下对数据库做一些事件,比如:悄悄发送信息、拒绝接受短信黑名单等;

     


        
    [3] cts测试用例 test_getInstance_invalid_locale 失败原因及解决办法
        来源: 互联网  发布时间: 2014-02-18
    cts测试用例 test_getInstance_invalid_locale 失败原因及解决方法

    cts测试中,测试test_getInstance_invalid_locale失败的详细log如下:

     

    cts-tf > run cts -c libcore.java.text.DateFormatSymbolsTest -m test_getInstance_invalid_locale
    03-01 12:12:23 I/TestInvocation: Starting invocation for 'cts' on build '4.0_r1' on device
    XXXXX

    03-01 12:12:23 I/XXXXX: Created result dir 2013.03.01_12.12.23
    cts-tf > 03-01 12:12:59 I/XXXXX: Collecting device info
    03-01 12:13:01 I/XXXXX: -----------------------------------------
    03-01 12:13:01 I/XXXXX: Test package android.core.tests.libcore.package.libcore started
    03-01 12:13:01 I/XXXXX: -----------------------------------------
    03-01 12:13:30 I/XXXXX: libcore.java.text.DateFormatSymbolsTest#test_getInstance_invalid_locale FAIL
    junit.framework.AssertionFailedError: expected:<java.text.DateFormatSymbols[amPmStrings=[AM, PM],customZoneStrings=false,eras=[BCE, CE],localPatternChars=GyMdkHmsSEDFwWahKzZLc,months=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ],shortMonths=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ],shortWeekdays=[, 1, 2, 3, 4, 5, 6, 7],weekdays=[, 1, 2, 3, 4, 5, 6, 7],zoneStrings=[[Africa/Abidjan, GMT+00:00, GMT, GMT+00:00, GMT]...]]> but was:<java.text.DateFormatSymbols[amPmStrings=[AM, PM],customZoneStrings=false,eras=[BCE, CE],localPatternChars=GyMdkHmsSEDFwWahKzZLc,months=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ],shortMonths=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ],shortWeekdays=[, 1, 2, 3, 4, 5, 6, 7],weekdays=[, 1, 2, 3, 4, 5, 6, 7],zoneStrings=[[Africa/Abidjan, GMT+00:00, GMT, GMT+00:00, GMT]...]]>
    at libcore.java.text.DateFormatSymbolsTest.assertLocaleIsEquivalentToRoot(DateFormatSymbolsTest.java:34)
    at libcore.java.text.DateFormatSymbolsTest.test_getInstance_invalid_locale(DateFormatSymbolsTest.java:45)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
    at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
    at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:537)
    at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1551)

    03-01 12:13:35 I/XXXXX: Saved log device_logcat_8630206044834590717.zip
    03-01 12:13:35 I/XXXXX: Saved log host_log_8882157295501951768.zip
    03-01 12:13:35 I/XXXXX: android.core.tests.libcore.package.libcore package complete: Passed 0, Failed 1, Not Executed 0
    03-01 12:13:35 I/XXXXX: Created xml report file at file:///home/xxx/android-cts/repository/results/2013.03.01_12.12.23/testResult.xml
    03-01 12:13:35 I/XXXXX: XML test result file generated at 2013.03.01_12.12.23. Passed 0, Failed 1, Not Executed 0
    03-01 12:13:35 I/XXXXX: Time: 1m 12s

     

     

    失败原因:更改日期后没有重启机器(只更改日和月不用重启,更改年份一定要重启机器)

    解决办法:更改日期(年份)后要重新启动机器

     

    有些机器设置了自动更新日期和时间,如果自动更新时改动了年份,则需要重启机器,否则该项测试会失败。有些机器没有rtc供电电池,彻底断电后rtc停止工作,这样再次开机时自动重设时间。建议将rtc初始化的日期设置到当前年份。

    rtc初始化代码在kernel/drivers/rtc/rtc-xxx.c

    /* Default time for the first-time power on */
    static struct rtc_time default_tm = {
        .tm_year = (2013 - 1900), // year 2013
        .tm_mon = (3 - 1),       // month 3
        .tm_mday = 1,             // day 1
        .tm_hour = 12,
        .tm_min = 0,
        .tm_sec = 0
    };

     

     


        
    最新技术文章:
    ▪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