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


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

    MainActivity:

    public class MainActivity extends Activity {
    	
    	public static final int UPDATE = 000;
    	TextView xml;
    	TextView java;
    	int count = 0;
    	Handler handler = new Handler(){
    		@Override
    		public void handleMessage(Message msg) {
    			// TODO Auto-generated method stub
    			switch (msg.what) {
    			case UPDATE:
    				count ++;
    				xml.setText(count);
    				break;
    
    			default:
    				break;
    			}
    		}
    	};
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		
    		IntentFilter javaFilter = new IntentFilter();
    		javaFilter.addAction("android.intent.action.TIME_TICK");
    		registerReceiver(receiver, javaFilter);
    		xml = (TextView) findViewById(R.id.xml);
    		java = (TextView) findViewById(R.id.java);
    	}
    	
    	BroadcastReceiver receiver = new BroadcastReceiver() {
    		
    		@Override
    		public void onReceive(Context context, Intent intent) {
    			// TODO Auto-generated method stub
    			Date date = new Date();
    			SimpleDateFormat dateFormat = new SimpleDateFormat("HHmm");
    			java.setText(dateFormat.format(date));
    		}
    	};
    	
    	protected void onDestroy() {
    		unregisterReceiver(receiver);
    	};
    	
    	class Accept extends BroadcastReceiver {
    
    		@Override
    		public void onReceive(Context arg0, Intent arg1) {
    			// TODO Auto-generated method stub
    			Message message = handler.obtainMessage();
    			message.what = UPDATE;
    			handler.sendMessage(message);
    		}
    
    	}
    }
    

    在manifest文件中注册如下:

    <receiver android:name="jason.recevertext.Accept">
                <intent-filter >
                    <action android:name="android.intent.action.TIME_TICK"/>
                </intent-filter>
            </receiver>

    布局文件如下:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/xml"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/hello_world" />
    
        <TextView
            android:id="@+id/java"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/hello_world" />
    
    </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()方法注册。

    作者:jason0539

    微博:http://weibo.com/2553717707

    博客:http://blog.csdn.net/jason0539/article/details/10815787(转载请说明出处)

  • 相关阅读:
    版本管理
    图解电路
    Java语言基础
    电工学入门
    11个例子教会你看电路图
    如何提高STM32的学习效率
    开发板入门
    Altium Designer
    电子设计从零开始
    推荐书籍
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3295314.html
Copyright © 2020-2023  润新知