zoukankan      html  css  js  c++  java
  • Android 四大组件学习之BroadcastReceiver四

    本节学习系统中特殊的广播接收者。

    我们前面几节不是说了,当广播接受者一旦注冊到系统中,当系统发送的广播和你注冊的广播的action匹配时,系统就会启动广播接收者所在的进程。除非用户手动停止广播接收者所在的进程。但是生活中有这样一种情况,比方说:我在玩网络游戏,如果说游戏本身在系统电量低的情况下,会自己主动保存当前游戏的进度。也就是存档的。能够这么说。此广播接受者仅仅有在用户玩游戏时才须要启动,别的时候用户是不须要的。

    如果此广播接收者一直常驻于系统。那不是非常浪费系统资源。

    所以我们就须要动态的启动广播接收者。和停止广播接收者。但是大家知道。广播接收者仅仅要在清单文件里注冊过了的,就会永远启动的。

    所以唯一的办法就是不在清单文件里注冊,在代码中动态注冊。


    说了这么多。就是说能够用代码动态的注冊广播接收者。

    说到在代码中注冊广播接收者,那Android系统中规定。屏幕锁屏和解锁,以及电量改变必须用代码注冊。在清单文件里注冊是不起作用的。那是由于,屏幕锁屏和解锁,以及电量改变事件太频繁发生了。假设在清单文件里注冊,将会对系统消耗非常大。


    那我们就用屏幕解锁和锁屏实现代码中注冊广播接收者

    这次我们用服务去创建广播接收者

    Activity的代码:也就是两个button。一个用于创建创建服务。一个用于停止服务

    public class MainActivity extends Activity {
    
    	Intent intent;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            intent = new Intent(this, ScreenService.class);
        }
        
        //启动服务
        public void openScreen(View v)
        {
        	Log.i("MainActivity", "启动广播接收者服务");
        	startService(intent);
        }
        
        //关闭服务
        public void closeScreen(View v)
        {
        	Log.i("MainActivity", "关闭广播接收者服务");
        	stopService(intent);
        }
    }
    然后Service的代码:

    public class ScreenService extends Service {
    
    	private ScreenReceiver sReceiver;
    	@Override
    	public IBinder onBind(Intent intent) {
    		// TODO Auto-generated method stub
    		return null;
    	}
    
    	@Override
    	public void onCreate() {
    		// 注冊广播接收者
    		super.onCreate();
    		//创建一个广播接收者
    		sReceiver = new ScreenReceiver();
    		
    		//指定接收那种类型的广播
    		IntentFilter filter = new IntentFilter();
    		//指定关屏幕和开屏幕
    		filter.addAction(Intent.ACTION_SCREEN_OFF);
    		filter.addAction(Intent.ACTION_SCREEN_ON);
    		//注冊广播接收者
    		registerReceiver(sReceiver, filter);
    		Log.i("ScreenService", "广播接受者已注冊");
    	}
    	
    	@Override
    	public void onDestroy() {
    		// 销毁广播接收者
    		super.onDestroy();
    		unregisterReceiver(sReceiver);
    		Log.i("ScreenService", "广播接受者已销毁");
    	}
    }
    在Service的onCreate方法中注冊广播接收者。在Destory方法中销毁广播接收者

    终于广播接收者的代码:

    public class ScreenReceiver extends BroadcastReceiver {
    
    	@Override
    	public void onReceive(Context context, Intent intent) {
    		// TODO Auto-generated method stub
    		String action = intent.getAction();
    		
    		if(Intent.ACTION_SCREEN_OFF.equals(action))
    		{
    			//接收到管屏幕的广播
    			Log.i("ScreenReceiver", "屏幕关闭!");
    		}
    		else if(Intent.ACTION_SCREEN_ON.equals(action))
    		{
    			//接收到开屏幕的广播
    			Log.i("ScreenReceiver", "屏幕开启!");
    		}
    	}
    }

    清单文件里,须要要配置服务,广播接收者不须要配置

        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <service android:name="com.demo.screenactivity.ScreenService"></service>
        </application>
    执行效果例如以下:


    ok。 就到这里。大家了解下即可






  • 相关阅读:
    WinAPI: ExtractIcon 获取 EXE、DLL 或 ICO 文件中的图标
    WinAPI: LoadLibrary、FreeLibrary 载入与载卸模块
    WinAPI: LoadCursor 从资源中载入光标
    WinAPI: LoadIcon 从资源中载入图标
    WinAPI: LoadString 从资源中载入字符串
    学习使用资源文件[9] WAVE 资源
    学习使用资源文件[11] DLL 中的资源文件
    WinAPI: LoadBitmap 从资源中载入位图
    学习使用资源文件[10] 嵌入和提取任何类型的文件
    肛男四代
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6927872.html
Copyright © 2011-2022 走看看