android之IntentFilter的用法_Intent.ACTION_TIME_TICK在manifest.xml不起作用

在模仿一个天气预报的widget时候,用到了IntentFilter,感觉在manifest.xml注册的receiver跟用代码写registerReceiver()的效果应该是相同的,于是想证明一下,就写了如下一段程序:

MainActivity:

[java][/java] view plaincopyprint?

  1. public class MainActivity extends Activity {
  2.     public static final int UPDATE = 000;
  3.     TextView xml;
  4.     TextView java;
  5.     int count = 0;
  6.     Handler handler = new Handler(){
  7.         @Override
  8.         public void handleMessage(Message msg) {
  9.             // TODO Auto-generated method stub
  10.             switch (msg.what) {
  11.             case UPDATE:
  12.                 count ++;
  13.                 xml.setText(count);
  14.                 break;
  15.             default:
  16.                 break;
  17.             }
  18.         }
  19.     };
  20.     @Override
  21.     protected void onCreate(Bundle savedInstanceState) {
  22.         super.onCreate(savedInstanceState);
  23.         setContentView(R.layout.activity_main);
  24.         IntentFilter javaFilter = new IntentFilter();
  25.         javaFilter.addAction(“android.intent.action.TIME_TICK”);
  26.         registerReceiver(receiver, javaFilter);
  27.         xml = (TextView) findViewById(R.id.xml);
  28.         java = (TextView) findViewById(R.id.java);
  29.     }
  30.     BroadcastReceiver receiver = new BroadcastReceiver() {
  31.         @Override
  32.         public void onReceive(Context context, Intent intent) {
  33.             // TODO Auto-generated method stub
  34.             Date date = new Date();
  35.             SimpleDateFormat dateFormat = new SimpleDateFormat(“HHmm”);
  36.             java.setText(dateFormat.format(date));
  37.         }
  38.     };
  39.     protected void onDestroy() {
  40.         unregisterReceiver(receiver);
  41.     };
  42.     class Accept extends BroadcastReceiver {
  43.         @Override
  44.         public void onReceive(Context arg0, Intent arg1) {
  45.             // TODO Auto-generated method stub
  46.             Message message = handler.obtainMessage();
  47.             message.what = UPDATE;
  48.             handler.sendMessage(message);
  49.         }
  50.     }
  51. }

在manifest文件中注册如下:

[java][/java] view plaincopyprint?

  1. <receiver android:name=”jason.recevertext.Accept”>
  2.             <intent-filter >
  3.                 <action android:name=”android.intent.action.TIME_TICK”/>
  4.             </intent-filter>
  5.         </receiver>

布局文件如下:

[html][/html] view plaincopyprint?

  1. <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
  2.     xmlns:tools=”http://schemas.android.com/tools”
  3.     android:layout_width=”match_parent”
  4.     android:layout_height=”match_parent”
  5.     android:orientation=”vertical”>
  6.     <TextView
  7.         android:id=”@+id/xml”
  8.         android:layout_width=”wrap_content”
  9.         android:layout_height=”wrap_content”
  10.         android:text=”@string/hello_world” />
  11.     <TextView
  12.         android:id=”@+id/java”
  13.         android:layout_width=”wrap_content”
  14.         android:layout_height=”wrap_content”
  15.         android:text=”@string/hello_world” />
  16. </LinearLayout>

总体说来很简单,就是通过两种方式注册了IntentFilter,然后接收到更新的intent之后更新主界面上的两个textview

结果java代码注册的IntentFilter很正常,xml注册的IntentFilter没有任何作用.

事实证明我的想法是错的,经过查询资料,发现:

在众多的Intent的action动作中,Intent.ACTION_TIME_TICK是比较特殊的一个,根据SDK描述:

Broadcast Action: The current time has changed. Sent every minute. You can not receive this through components declared in manifests, only by exlicitly registering for it withContext.registerReceiver()

意思是说这个广播动作是以每分钟一次的形式发送。但你不能通过在manifest.xml里注册的方式接收到这个广播,只能在代码里通过registerReceiver()方法注册。

标签