我只是在玩某种应用程序间通信的场景,并试图规避在 Android 中应用程序的主要活动无法通过自定义权限来保护的问题(因为在这种情况下它无法启动完全)。
我尝试改用两个活动:1)不受保护的主要活动。2)当一个按钮被点击时,主活动发送一个明确的意图来启动第二个活动。那个执行一些敏感的工作并受到自定义权限(“toy.test.permission.ACTIVATE_SECOND_ACTIVITY”)的保护。
这个想法是,如果主要活动是由用户从启动器启动的,或者是由使用显式意图的外部恶意应用程序启动的,我们可以在用户按下按钮继续之前警告用户。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
final Button start = (Button) findViewById(R.id.start);
start.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent activateIntent = new Intent(MainActivity.this,
SecondActivity.class);
startActivity(activateIntent);
finish();
}
}); ....
Manifest.xml 文件如下所示:
<application
android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".SecondActivity"
android:label="@string/second_activity_name"
android:theme="@style/AppTheme"
android:permission="toy.test.permission.ACTIVATE_SECOND_ACTIVITY" >
<intent-filter>
<action android:name="toy.test.action.ACTIVATE_SECOND_ACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
(此外,SecondActivity 可以通过一个隐含的 Intent 使用 actionString="toy.test.action.ACTIVATE_SECOND_ACTIVITY" 使用权限“toy.test.permission.ACTIVATE_SECOND_ACTIVITY”从朋友应用程序启动。)
现在android 2.3.3和android 4.2的区别:
在 android 4.2 设备或模拟器上,SecondActivity 可以通过单击 Start 按钮从 MainActivity 启动而没有任何问题,尽管应用程序没有明确要求“toy.test.permission.ACTIVATE_SECOND_ACTIVITY”权限。
但是,在 android 2.3.3 模拟器上,SecondActivity 无法启动,因为 SecurityException:
FATAL EXCEPTION: main
java.lang.SecurityException: Permission Denial: starting Intent { cmp=toy.test/.SecondActivity }
from ProcessRecord{406827d0 405:toy.test/10034} (pid=405, uid=10034) requires
toy.test.permission.ACTIVATE_SECOND_ACTIVITY
我很困惑:两个 Android 版本之间的权限执行是否发生了变化?android 4.2是否故意允许这种情况,即未经许可激活SecondActivity?(当然,这很有用。)
非常感谢任何答案,puffin137