昨天po主去看琅琊榜了,摸鱼了一整天
之前显示启动activityB的时候是通过
startActivity(new Intent(A.this,B.class));
其中,B.class就是显式启动的特点,这种方式智能启动本应用中的其他activity,因为别的应用里的activity的class是找不到的。
这时候就比较适合使用隐式启动了
要启动的是B,那么在B的activity配置里面,通过Intent-Filter来配置
<activity
android:name=".B"
android:label="B">
<intent-filter>
<action android:name="aty_B" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
category指定B用什么形式呈现,DEFAULT就是以Activity形式呈现
action就是一串字符串,这里自己写一个简单的aty_B,然后在java代码里面直接
startActivity(new Intent("aty_B"));
就可以启动B了
在Android studio里面,新建一个module,叫app2,然后从app2里面启动app里面的B试试看。
同样在app2的MainActivity中
startActivity(new Intent("aty_B"));
可以启动app1里面的B,这样就实现了跨应用启动activity了。
如果不想被别的应用启动的话,可以如下配置
activity android:exported="false"
Q:不过po主自己测试了以后发现还是能访问,不知道为啥
百度了一下,http://blog.csdn.net/lvxiangan/article/details/46859349
这里说
同时,一定要注意的是, 非公开的Activity不能设置intent-filter,因为,如果假设在同一机器上,有另外一个app有同样的intent-filter的话, 调用该Activity的intent会唤醒android的选择画面, 让你选择使用那个app接受该intent。这样就会事实上绕过了非公开的设置。
但是按照视频中的步骤的话,得不到它那种结果,头疼。
如果两个activity配置一样的action字符串呢?
例如B、C两个activity
<activity
android:name=".B"
android:label="B">
<intent-filter>
<action android:name="com.jackie.courseintent.aty_B" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".C"
android:label="C">
<intent-filter>
<action android:name="com.jackie.courseintent.aty_B" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
这时候再按照之前的方法,在app2的MainActivity中
startActivity(new Intent("com.jackie.courseintent.aty_B"));
关于data配置:
给C配置一下
<data android:scheme="C"/>
然后启动:
startActivity(new Intent("com.jackie.courseintent.aty_B",Uri.parse("C://hello")));
此时:
不会出现上面的选择B还是C的选项,而是直接跳到了C
如果将Activity的data属性里面,设置scheme为http,那么这个Activity就可以相应http协议的请求
<activity
android:name=".LocalAty"
android:label="@string/title_activity_local_aty">
<intent-filter>
<category android:name="android.intent.category.APP_BROWSER" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http"/>
<action android:name="android.intent.action.VIEW" />
</intent-filter>
</activity>
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
而且如果绑定了服务,解绑了以后,服务会直接destroy,此时重新绑定的话,会从create开始新的生命周期,也就是说,在Service的生命周期里面,只有onStart可以被反复执行,其他的行为在一个生命周期里只执行一次