从其他应用程序的入口点android启动应用程序

时间:2018-06-29 07:21:38

标签: c# android xamarin.android

我有xamarin.android项目Client1和1 CommonApp项目(在同一解决方案内),这些项目具有所有通用代码。从Client1项目中,我需要启动CommonApp,我的代码要在Client1应用中启动

public class MainActivity : AppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.activity_main);
        FindViewById<Button>(Resource.Id.btn1).Click += delegate {

            //Starting CommonApp project
            StartActivity(new Intent(Application.Context, typeof(CommonApp.MainActivity)));
        };
    }
}

下面的1是CommonApp MainActivity,其中调试器指向前进,但未启动新活动,但是当我按下物理后退按钮时,该活动又被添加到了堆栈中。

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    //This is CommonApp
    SetContentView(Resource.Layout.activity_main);
}

CommonApp activity_main有

 <TextView
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:text="This is CommonApp">
</TextView>

说明:我有2个android应用的解决方案。 1个CommonApp和第二个客户端1。 Cleint1是具有CommonApp类型的.dll的启动项目。从Cleint1应用程序中,我通过导入CommonApp名称空间来启动CommonApp。我可以有许多项目Client1,Client2,Client3 ... etc,它们带有自己的图标,应用程序名称,启动屏幕和google-service.json。当我在启动时设置Client2时,它将成为Client2项目和CommonApp中所有可用的通用代码。

要求Here

输出屏幕截图 enter image description here

应用日志

Log

更新的屏幕截图:

enter image description here

3 个答案:

答案 0 :(得分:2)

我认为CommonApp Activity实际上已启动(如调试器所示),但是它没有使用正确的布局文件。两个MainActivity(来自CommonApp的一个和来自Client1的一个)都使用名为activity_main的布局。因此,两个项目都包含一个activity_main.xml文件,并且似乎一个(来自Client1项目)覆盖了另一个文件。

没有用于资源的名称空间,您需要重命名布局(以及您要保持唯一性的任何其他资源)以避免冲突。您可以添加前缀,例如common_activity_mainclient_activity_main

已编辑(评论中的其他信息)

包含公共部分的项目应该是 Android类库,而不是 Android App 。否则,它似乎可以正常工作(没有构建错误),但是APK中没有布局文件。

答案 1 :(得分:0)

如果您知道另一个应用程序的软件包名称,则可以通过调用intent来实现目标。

String appName = "appName";
String packageName = "package.of.another.application";
openApp(context, appName, packageName);

public static void openApp(Context context, String appName, String packageName) {
    if (isAppInstalled(context, packageName))
        if (isAppEnabled(context, packageName))
            context.startActivity(context.getPackageManager().getLaunchIntentForPackage(packageName));
        else Toast.makeText(context, appName + " app is not enabled.", Toast.LENGTH_SHORT).show();
    else Toast.makeText(context, appName + " app is not installed.", Toast.LENGTH_SHORT).show();
}

private static boolean isAppInstalled(Context context, String packageName) {
    PackageManager pm = context.getPackageManager();
    try {
        pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
        return true;
    } catch (PackageManager.NameNotFoundException ignored) {
    }
    return false;
}

private static boolean isAppEnabled(Context context, String packageName) {
    boolean appStatus = false;
    try {
        ApplicationInfo ai = context.getPackageManager().getApplicationInfo(packageName, 0);
        if (ai != null) {
            appStatus = ai.enabled;
        }
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    return appStatus;
}

答案 2 :(得分:0)

确保未安装您的通用应用程序。如果已经安装,您可以尝试

 Intent intent = PackageManager.GetLaunchIntentForPackage("Com.CommonAPP.CommonAPP");
 if (intent != null)
 {
    StartActivity(intent);
 }

希望这会对您有所帮助。