1.Activity声明周期(详尽含底层)
Activity A 和 Activity B,A 中存在按钮点击跳转 B,
创建A onCreate(A) -> onStart(A) -> onResume(A),A处于活动可视状态;
点击按钮由A跳转至B,B成为活动界面 onPause(A) -> onCreate(B) -> onStart(B) -> onResume(B) ->onStop(A);
点击back键回到A界面,onPause(B) -> onRestart(A) -> onStart(A) -> onResume(A) ->onStop(B) ->onDestory(B);
点击home键最小化当前页面 onPause() -> onStop(), 重新调起当前页面 onRetart() -> onStart() -> onResume().
2.Android中可以实现进程间的通信有哪些?
android SDK提供了4中跨进程间的通信activity,service,broadcast,ContentProvide,即四大组件。
- Activity:可以跨进程调用其他程序的Activity;
- ContentProvider:可以跨进程访问其他应用的数据,以Cursor对象形式访问,同时也可对其他应用的数据进行增删改操作;
- Broadcast:向安卓系统中所有应用发送广播,需要跨进程通信的应用可以进行监听这些广播;
- Service:和ContentProvider一样可以访问其他应用程序的数据,但是与ContentProvider返回的结果不同,service返回的是Java对象,此种跨进程间的服务是AIDL服务。
具体的实现过程
一、 activity
跨进程访问与进程内访问不同,跨进程不需要指定Context对象和Activity的class对象,而是指定要访问的Activity所对应的Action(一个字符串)。有些还需要指定一个Uri。
例如:
(1)在应用中拨打电话
Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel: 95533));
startActivity(intent);
(2)在A应用中a界面打开B应用的b界面,B应用中的b界面 BActivity在配置文件中进行如下设置,
<activity android:name=".BActivity">
<intent-filter>
<--自定义动作,一般用包名加类名,类名大写-->
<action android:name="com.birkhoffchu.cameraapp.BACTIVITY"/>
<--类型-->
<category android:name="android.intent.category.DEFAULT"/>
<--数据-->
<data android:scheme="zsc"/>
</intent-filter>
</activity>
任何一个需要隐式启动的Activity都必须要有此项 ,android.intent.category.MAIN和android.intent.category.LAUNCHER的filter中没有必要加入android.intent.category.DEFAULT,当然加入也没有问题。
如果又两个Activity,它的action相同时,当要启动此页面时,系统会出现选择框供其选则。
例如:
<activity android:name=".Main3Activity">
<intent-filter>
<action android:name="com.birkhoffchu.cameraapp.CHI"/>
<action android:name="com.birkhoffchu.cameraapp.HE"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="x-id"/>
</intent-filter>
</activity>
<activity android:name=".Main2Activity">
<intent-filter>
<action android:name="com.birkhoffchu.cameraapp.CHI"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
>在MainActivity.java里发送一个intent:
intent.setAction( "com.birkhoffchu.cameraapp.CHI");
//不加下面这行也行,因为intent的这个属性默认值即系Intent.CATEGORY_DEFAULT
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity( intent );
此时会弹出选择框提示用户选择,如果category相同,而action不同,则克匹配到,如果将上面改成intent.setAction("com.birkhoffchu.cameraapp.CHI"),则会匹配Main3Activity页面。
单单靠添加addCategory属性不能匹配,如:
Intent intent = new Intent();
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.addCategory("android.intent.category.hello");
startActivity(intent);
<activity android:name=".MyActivityTwo" android:label="@string/ activityTwo">
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.hello"></category>
</intent-filter>
</activity>
也可以根据action和data匹配
<activity android:name=".MyActivityTwo" android:label="@string/ activityTwo">
<intent-filter>
<action android:name="android.intent.action.leo"></action>
<category android:name="android.intent.category.DEFAULT"></category>
<data android:scheme="x-id"></data>
</intent-filter>
</activity>
//Uri uri = Uri.parse("x-id://www.google.com/getDetails?id=123");//这个也可以
//Uri uri = Uri.parse("x-id");//这个不行
//Uri uri = Uri.parse("x-id://");这个可以
Uri uri = Uri.parse("x-id:");//这个可以
Intent in = new Intent();
in.setAction("android.intent.action.leo");//去掉这行不行,单靠data不能匹配
in.addCategory(Intent.CATEGORY_DEFAULT);//可以去掉这行,因为intent的默认category值即系Intent.CATEGORY_DEFAULT
in.setData(uri);//去掉这行不行
startActivity(in);
可以通过intent.putExtra(name,value)传递数据,也可以在返回页面重写onActivity()方法获取返回值
Intent intent = new Intent();
intent.setAction("com.birkhoffchu.cameraapp.CHI");
Bundle bundle = new Bundle();
bundle.putString("msg","吃吃吃");
intent.putExtra("bundle",bundle);
startActivity(intent);
protected void onActivityResult(int requestCode, int resultCode,Intent data){
Toast.makeText(this, "返回值:" + data.getExtras().getString("result"),
Toast.LENGTH_LONG).show();
}