是否可以获取活动包的名称?进程间通信时调用应用程序?

时间:2016-03-21 06:24:29

标签: android android-intent ipc

我的应用程序中有一个Activity A,Application1Application2可以调用。

AcitivityA文件中Manifest的配置如下:

<activity
   android :name=".activity.ActivityA"
   android :exported="true"
   android :screenOrientation="portrait"/>

Application1Application2如何致电ActivityA

PackageManager packageManager = getPackageManager();
Intent intent = new Intent();
intent.setClassName(“com.abc.test", “com.abc.test.activity.ActivityA" );
List activities = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
if (activities.size() > 0 ) {
   startActivity(intent);
}

为了安全起见,我想在Application1中添加一个包含Application2ActivityA包名称的白名单,只有ActivityA's的包名才能打开{1}}来电者在白名单中。

因此可以获得Activities&#39;的包名称。 ActivityA中的来电应用?

编辑:

如果在Intent中没有额外数据就不可能,还有其他想法保持Activity A安全吗?

3 个答案:

答案 0 :(得分:1)

尝试Activity的{​​{3}}和getCallingPackage()方法。

答案 1 :(得分:0)

只要来电者没有提供额外的信息,答案就是否定。

如果您只想保护特定的来电者,请使用权限。 参见

如果您拥有所有来电者,那么我建议您使用相同的密钥对所有这些密码进行签名,并使用protectionLevel Signature的权限。

另一个需要更多代码的方法是使用服务进行通信。

从第一个链接引用:

  

使用Binder或Messenger是Android中RPC风格IPC的首选机制。它们提供了一个定义良好的接口,可以根据需要实现端点的相互身份验证。

答案 2 :(得分:0)

我所做的是通过意图传递调用活动。例如

public class MainActivity extends AppCompatActivity {
    private final static String THIS_ACTIVITY = "MainActivity";
.........

    Intent intent = new Intent(this, ShopAddActivity.class);
    intent.putExtra("Caller",THIS_ACTIVITY);
    startActivity(intent);

并在另一项活动中(调用相同的子活动): -

public class ShopListByCursorActivity extends AppCompatActivity {

    private final static String THIS_ACTIVITY = "ShopListByCursorActivity";

.......

    Intent intent = new Intent(findViewById(R.id.aslbclv01).getContext(), ShopAddActivity.class);
    intent.putExtra("Caller", THIS_ACTIVITY + "Update");
    startActivity(intent);

然后在被调用的活动中(作为检测呼叫者的一个例子)

if(getIntent().getStringExtra("Caller").equals("ShopListByCursorActivityUpdate")) {

      DO STUFF HERE
        }