如何从共享菜单阻止我的活动在另一个应用程序中打开另一个实例?

时间:2018-10-25 05:31:54

标签: java android oncreate onnewintent

我有一个允许其他可以共享文件的应用程序在共享菜单上选择的应用程序,打开该应用程序并将文件“传输”到我的应用程序中。

我的问题是,当他们从共享菜单中选择我的应用程序时(例如,在图库中,选择了几张照片后,他们选择与我的应用程序共享),登录活动在图库应用程序中打开了

请注意,我已经尝试过该过程在较旧的设备上运行,但对较新的设备却无效。

这是我的manifest.xml

<application
    android:name="com.Application"
    android:allowBackup="true"
    android:fullBackupContent="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:mimeType="*/*"
    android:theme="@style/AppTheme">
    <activity
        android:name=".MainActivity"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:label="@string/app_name"
        android:windowSoftInputMode="adjustPan"/>
    <activity
        android:name=".login.LoginActivity"
        android:label="@string/app_name"
        android:launchMode="singleInstance"
        android:windowSoftInputMode="adjustResize|stateVisible">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="*/*" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.SEND_MULTIPLE" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="*/*" />
        </intent-filter>
    </activity>
</application>

此应用程序有两个活动,分别是Login和Main,如果登录成功,Main将被加载。

我尝试了不同类型的launcherMode设置,但是没有阻止实例在画廊中创建的情况

这是从我的登录活动中获得的

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_login);
    receivedIntent = getIntent();
    //set orientation
    setRequestedOrientation(isPhone() ? ActivityInfo.SCREEN_ORIENTATION_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    if (intent != null && intent.getAction() != null && (intent.getAction().equals(Intent.ACTION_SEND) || intent.getAction().equals(Intent.ACTION_SEND_MULTIPLE))){
        finish();
        startActivity(intent);
    }
}

问题是,在较旧的设备上,按预期调用了onNewIntent方法,但是在较新的设备上,它只是忽略了launcherMode并创建了新实例并运行onCreate()

从共享菜单中调用时,如何使应用程序“强制”启动的任何想法?

当前测试设备-Samsung mobile Android 8.0,API 26-无法正常工作                           三星平板电脑Android 7.1.1,API 25-正常工作

2 个答案:

答案 0 :(得分:0)

您遇到的所有问题都与权限有关, kitkat(4.4.2)以下的旧设备不需要文件权限,而在新设备中,需要访问文件数据的权限(即图库和其他)。 您必须以编程方式授予权限

if (Build.VERSION.SDK_INT > 19) {

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            arrPerm.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }

        if (!arrPerm.isEmpty()) {
            String[] permissions = new String[arrPerm.size()];
            permissions = arrPerm.toArray(permissions);
            ActivityCompat.requestPermissions(this, permissions, MY_PERMISSIONS_REQUEST);
        } 
    }

授予权限后,您可以执行操作:

if (Build.VERSION.SDK_INT > 19) {
                    if (isPermissionGranted()) {
                        //Do your Task of gallery
                    } 
                }

或者,您可以直接使用库: https://github.com/nabinbhandari/Android-Permissions

答案 1 :(得分:0)

我对设备上的其他应用程序进行了一些研究,发现仅当从应用程序“图库”共享图像时才出现此问题,否则代码按预期工作,因此我认为这可能是图库本身的问题或预期的问题画廊应用程序的行为。