标签:
1)Android 中的一个应用组件
2)Android 中的广播接收对象
1)实现一对多的跨进程(Process)业务通知操作。
2)实现与系统应用的一些协同操作。
3)实现组件之间的数据传递 ,协同操作。
例如
1)实现电话的拦截
2)实现短信拦截
3)发现系统电量不足
4)网络链接状态检测
5).......
1)系统广播处理
2)应用广播处理
注意:系统广播的接收通常会需要一定权限。
1)编写类继承BroadcastReceiver
2)广播接收者的注册:
a)在清单配置文件进行注册(告诉底层系统)
<receiver ....>
b)在Java代码中进行注册
b.1)registerReceiver
b.2)unregisterReceiver
1)静态注册每次接收新的广播,都会创建一个广播接收者对象,此对象的onReceive方法执行结束其生命周期也会伴随结束。
2)动态注册的广播接收者,其对象生命周期何时结束取决于何时解除的注册。
public class MainActivity extends Activity { MyReceiver02 receiver02; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //动态注册广播接收者 receiver02=new MyReceiver02(); IntentFilter filter=new IntentFilter(); filter.addAction("action.receiver02"); registerReceiver(receiver02,filter); } /**发送给静态注册的广播接收对象*/ public void onClick01(View v){ sendBroadcast(new Intent(this,MyReceiver01.class)); } /**发送给动态态的广播接收对象*/ public void onClick02(View v){ sendBroadcast(new Intent("action.receiver02")); } @Override protected void onDestroy() { super.onDestroy(); //解除注册(此时receiver对象会销毁) unregisterReceiver(receiver02); } } |
AndroidManifest.xml: <receiver android:name="com.example.day19.MyReceiver01" android:enabled="true" android:exported="true" > </receiver> |
有序广播是按照广播接收者的优先级接收广播,优先级比较高的广播接收者对象在接收到广播以后可以选择广播要继续传递还是要终止传递。
发送有序广播相关方法:
sendOrderBroadcast(......)
1)静态注册:默认优先级从上到下依次递减
2)静态注册:可以在intent-filter元素中借助 priority属性配置优先级(范围-1000~+1000)
3)动态注册:优先级的设置需要借助IntentFilter对象的setPriority()进行设置。
优先级别高的广播接收者可以通过abortBroadcast方法终止广播的继续传递。
可以通过getResultData获得相关内容,也可以通过setResultData等方法修改相关内容。
public class MainActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onClick(View v){ //发送有序广播 sendOrderedBroadcast(new Intent("action.RECEIVER_ORDER"), "permission.R01"); } } |
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <permission android:name="permission.R01"/> <uses-permission android:name="permission.R01"/> |
<receiver android:name="com.example.day19.MyReceiver01" android:enabled="true" android:exported="true" > <intent-filter android:priority="800"> <action android:name="action.RECEIVER_ORDER"/> </intent-filter> </receiver> <receiver android:name="com.example.day19.MyReceiver02" android:enabled="true" android:exported="true" > <intent-filter android:priority="900"> <action android:name="action.RECEIVER_ORDER"/> </intent-filter> </receiver> <receiver android:name="com.example.day19.MyReceiver03" android:enabled="true" android:exported="true" > 数值越大,优先级越大 <intent-filter android:priority="1000"> -1000到1000 <action android:name="action.RECEIVER_ORDER"/> </intent-filter> </receiver> |
public class MainActivity extends Activity { private ProgressBar pBar; private ProgressRecever receiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); pBar=(ProgressBar) findViewById(R.id.progressBar1); //注册广播接收者 receiver=new ProgressRecever(); IntentFilter filter=new IntentFilter(); filter.addAction("action.PROGRESS_UPDATA"); registerReceiver(receiver, filter); } private class ProgressRecever extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { int progress=intent.getIntExtra("progress", -1); 接收返回值 pBar.setProgress(progress); boolean isCompleted=intent.getBooleanExtra("isCompleted", false); if(isCompleted)pBar.setVisibility(View.GONE); 更新页面 } } public void onClick(View v){ pBar.setMax(10); startService(new Intent(this,DownService.class)); 启动服务 }
@Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(receiver); } } |
public class DownService extends IntentService {好处之一是完成后会自动停止 public DownService() { super("DownService"); } @Override protected void onHandleIntent(Intent intent) { for(int i=1;i<=10;i++){ try{ Thread.sleep(1000); }catch(Exception e){e.printStackTrace();}; Intent it=new Intent("action.PROGRESS_UPDATA"); it.putExtra("progress", i); sendBroadcast(it); 发送广播 } Intent it=new Intent("action.PROGRESS_UPDATA");新Action it.putExtra("isCompleted", true); sendBroadcast(it); 又发送广播 } @Override public void onDestroy() { super.onDestroy(); Log.i("TAG", "下载完成"); } } |
1)Android 中的一个应用组件?(生命周期方法)
2)Android 中的Context?(强大的资源访问能力)
3)Android 中的Controller?(呈现view,访问model)
1)呈现UI,实现与用户交互。
2)控制UI逻辑,访问model。
Activity包含一个window窗口,可以此窗口呈现UI对象。
a)onCreate (Activity 创建时执行)
b)onRestart (Activity重新启动时执行)
c)onStart (Activity启动时执行)
d)onResume(Activity 运行时执行)
e)onPause (Activity 暂停时执行)
f)onStop (Activity 停止时执行)
g)onDestroy(Activity 销毁时执行)
a)onSaveInstanceState (此方法用户状态保存)
b)onRestoreInstanceState(此方法用于状态恢复,也可以在onCreate方法进行状态恢复)
说明:
当app所在进程处于后台运行时,进程的优先级就会降低,在内存不足时有可能会被kill,当一旦被kill后,假如再次运行希望数据被恢复,可以在activity暂停时将状态信息进行保存。
Activity在启动以后会存储在一个回退栈中,栈顶元素为正在运行的activity,栈底最先启动
的那个activity.一个app进程可能会存在很多这样的回退栈。
Activity在启动时是可以指定启动模式的,一般可以在清单配置文件中通过修改activity的launchMode属性进行配置,它的值有如下四种
类型:
1)standard(标准模式):每次启动activity都会重新
创建一个新的实例。(此模式为默认模式)
2)singleTop(栈顶模式):当此activity已经是栈顶时,再次启动不会创建新的activity.
3)singleTask(单任务模式):一个任务栈中此activity的实例只能有一份,当它不是栈顶时,再次启动它时,位于它上面的activity会销毁。
4)singleInstance(单实例模式):在内存中此activity实例只有一份,且会独享一个任务栈。
<activity android:name="com.example.day19.SecondActivity" android:label="@string/app_name" android:launchMode="singleTask" /> <activity android:name="com.example.day19.ThirdActivity" android:label="@string/app_name" android:launchMode="singleTask" android:taskAffinity="a.b.c" /> <activity android:name="com.example.day19.FourthActivity" android:label="@string/app_name" android:launchMode="singleTask" android:taskAffinity="a.b.c" /> <activity android:name="com.example.day19.BaseActivity" android:label="@string/title_activity_base" > </activity> |
1).Activity的亲族设置与启动模式会影响activity在任务栈中的一个存储位置,亲族设置的配置需要借助activity的taskAffinity属性进行配置。
2).在android中每个任务栈都有一个亲族值,此值与回退栈的栈底activity的亲族值相同,每个activity都有亲族值,假如没有配置默认与application对象的亲族值相同,application对象的亲族值假如没有配置默认与清单配置文件的根元素指定的包名(package)相同。
3).亲族值一般会与activity的单任务模式和单实例模式一起使用。
4).singleTask模式的activity在启动时,首先检测内存中有没有相同亲族值的任务栈,假如没有会创建一个新的任务栈进行存储。通过singleTask模式启动的非singleInstance模式的activity会与这个singleTask模式的activity存储在同一个任务栈中。
5).singleInstance模式的activity在启动其它的activity时,这个activity存储在哪里取决于有没有相同亲族配置的任务栈,假如有则直接存储,假如没有则会创建一个新的任务栈,再进行存储。
a)同一个app内部activity之间的启动
b)不同app的activity之间的启动(隐式意图)
APP1: public class MainActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setTitle(getTaskId()+":"+getClass().getSimpleName()); } public void onClick(View v){ startActivity(new Intent("action.OTHER_ACTIVITY")); 隐式意图保持一致 } } |
APP2 <activity android:name="com.example.day19.OtherActivity02" android:label="@string/title_activity_other_activity02" android:launchMode="singleTask" > <intent-filter> <action android:name="action.OTHER_ACTIVITY" /> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> 必须加上 </activity> |
注意:
在使用隐式意图启动某个activity时,此acitivty的intent-filter内部还需要添加一个默认分类:
android.intent.category.DEFAULT
标签:
原文地址:http://blog.csdn.net/gsd1602_yingmu/article/details/51336178