我的困境解释了
我无法弄清楚或发现阻止我的活动启动。这是必要的,因为我正在制作一个具有意图过滤器的目录管理器以打开任何文件,以试图轻松地找到并重命名该文件。例如,单击通知中的文件以由我的应用打开以进行重命名。
我的困境已总结
但是如果您已经在我的应用程序中,则运行此意图是没有意义的。因此,在这种情况下,我想以编程方式停止选择我的应用。
我的解决方案
我尝试了很多东西。 Google,Android上有关ActivityInfo的参考。我什至尝试创建自己的活动选择器对话框。这不能100%准确地工作。如果可以,我可以简单地从列表中省略我的活动。
我谦虚地寻求帮助。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="jav.android.dir_mgr">
<uses-sdk android:minSdkVersion="12" android:targetSdkVersion="27" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<application
android:allowBackup="true"
android:icon="@mipmap/app_icon"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".DirectoryExplorer"
android:screenOrientation="portrait" >
<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.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="file" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="file" />
<data android:mimeType="*/*" />
</intent-filter>
</activity>
<activity
android:name=".SelectionWindow"
android:screenOrientation="portrait"
android:label="Selection Window"
android:allowEmbedded="true">
<intent-filter>
. <action android:name="jav.android.dir_mgr.SELECT" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>
答案 0 :(得分:1)
希望我能正确理解你的困境。
解决问题的一种方法是以编程方式取消注册您的活动,使其免于监听某个intent-filter
值。假设您有一个活动声明为:
<activity android:name=".FileHandlerActivity">
<intent-filter>
<action android:name="you-file-rename-action-name-here"/>
</intent-filter>
</activity>
在您的应用中执行此操作
PackageManager pm = getApplicationContext().getPackageManager();
ComponentName component = new ComponentName(getPackageName(),
getPackageName()+".FileHandlerActivity");
pm.setComponentEnabledSetting(component,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
请让我知道是否可行。
答案 1 :(得分:1)
您可以使用EXTRA_EXCLUDE_COMPONENTS
从显示给用户的列表中排除您自己的应用程序。请参阅documentation,其中指出:
您可以通过提供以下内容排除特定目标 Intent.EXTRA_EXCLUDE_COMPONENTS。这仅用于删除 您可以控制的目标。一个常见的用例是隐藏您应用的 当用户从您的应用程序中作为他们的用户共享时,共享目标 意图可能会在您的应用程序外部共享。
在致电后将Intent.EXTRA_EXCLUDE_COMPONENTS添加到您的意图中 Intent.createChooser()
答案 2 :(得分:0)
因此,据我了解,您需要一种方法来检查您的应用程序是否处于焦点状态。如果是这样,请尝试使用ActivityManager.getRunningAppProcesses()
,它将返回设备上正在运行的应用程序进程的列表。
您可以从那里遍历设备上正在运行的进程,并检查您的应用程序是否在其中列出以及它是否为RunningAppProcessInfo.IMPORTANCE_FOREGROUND
。
编辑:我假设您使用的是待处理的意图,那么您将无法检查您的应用程序是否已经按照上述方式运行。尝试按照this answer.
中的说明为应用程序使用“启动意图”