阻止Android活动自行启动

时间:2019-09-12 03:10:58

标签: android android-activity

我的困境解释了

我无法弄清楚或发现阻止我的活动启动。这是必要的,因为我正在制作一个具有意图过滤器的目录管理器以打开任何文件,以试图轻松地找到并重命名该文件。例如,单击通知中的文件以由我的应用打开以进行重命名。

我的困境已总结

但是如果您已经在我的应用程序中,则运行此意图是没有意义的。因此,在这种情况下,我想以编程方式停止选择我的应用。

我的解决方案

我尝试了很多东西。 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>

3 个答案:

答案 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.

中的说明为应用程序使用“启动意图”
相关问题