Android Activity 未找到异常和 BroadcastReceiver

Android Activity Not Found Exception and BroadcastReceiver

我的程序中有一些我想公开的功能,但我似乎没有让接收器工作。

我尝试了 Manifest/Receiver:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.nohkumado.intstringsynchro" >

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:resizeableActivity = "true">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".IntStringReceiver" android:exported="true"  android:enabled="true">
            <intent-filter>
                <action android:name="com.nohkumado.intstringsynchro.EDIT_STRINGXML"/>
            </intent-filter>
            <intent-filter>
                <action android:name="com.nohkumado.intstringsynchro.ADD_STRINGXML"/>
                <action android:name="com.nohkumado.intstringsynchro.DEL_STRINGXML"/>
                <data android:mimeType="text/plain"/>
            </intent-filter>
        </receiver>
    </application>
</manifest>

package com.nohkumado.intstringsynchro;
import android.content.*;
import android.widget.*;
import android.util.*;

public class IntStringReceiver extends BroadcastReceiver
{
  public static final String TAG = "Receiver";
  @Override
  public void onReceive(Context context, Intent intent)
  {
    Toast.makeText(context, "Intent Detected:"+intent.getAction(), Toast.LENGTH_LONG).show();

    switch (intent.getAction())
    {
      case "com.nohkumado.intstringsynchro.EDIT_STRINGXML":
        {
          Intent intentStartMainActivity = new Intent(context, MainActivity.class);
          intentStartMainActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
          context.startActivity(intentStartMainActivity);
          break;
        }
      case("com.nohkumado.intstringsynchro.ADD_STRINGXML"):
        {
          Toast.makeText(context, "add token "+intent.getExtras(), Toast.LENGTH_LONG).show();
          break;
        }
      case("com.nohkumado.intstringsynchro.DEL_STRINGXML"):
        {
          Toast.makeText(context, "del token "+intent.getExtras(), Toast.LENGTH_LONG).show();
          break;
        }
      default:
        {
          Toast.makeText(context, "no idea what to do with  "+intent, Toast.LENGTH_LONG).show();
          Log.d(TAG,"no idea what to do with  "+intent);
        }//default
    }//    switch (intent.getAction())
  }//  public void onReceive(Context context, Intent intent)
}//class

如前所述,我错误地在接收器部分放了一个

<category android:name="android.intent.category.DEFAULT"/>

这意味着在最好的情况下只有第一个 intent 过滤器被触发,而不是其他的....删除了那个

现在作为另一个应用程序,我创建了一个小测试器,它只有 3 个按钮来触发我想作为意图传递的 3 个动作,因为它只是一个小测试,我绑定了 onClick 事件布局文件:

package com.nohkumado.istester;

import android.app.*;
import android.content.*;
import android.net.*;
import android.os.*;
import android.view.*;
import android.widget.*;

public class MainActivity extends Activity 
{
  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
  }//onCreate
  public void callIntString()
  {
    callIntString(null);
  }
  public void callIntString(View but)
  {
    Toast.makeText(this, "call int string", Toast.LENGTH_SHORT).show(); 

    String name="com.nohkumado.intstringsynchro.EDIT_STRINGXML";
    Intent callIt = new Intent(name);
    try
    {
      startActivity(callIt);
    }
    catch (ActivityNotFoundException e)
    {
      Toast.makeText(this, "no available activity"+callIt, Toast.LENGTH_SHORT).show();

      //callGooglePlayStore();
    }
  }

  private void callGooglePlayStore()
  {
    Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.android.vending");
    ComponentName comp = new ComponentName("com.android.vending", "com.google.android.finsky.activities.LaunchUrlHandlerActivity"); // package name and activity
    launchIntent.setComponent(comp);
    launchIntent.setData(Uri.parse("market://details?id=com.nohkumado.intstringsynchro"));

    startActivity(launchIntent);
  }//callIntString
}

这是我的理解问题,而不是使用 startActivity,我应该尝试 sendBroadcast(launchIntent);

好的,结束这个... 首先,我并不完全清楚,清单中的 activity 合同为任何人打开了一条调用此 activity.

的途径

接下来,我有一个特定的应用程序,我想向其他人开放,这意味着编辑 android 项目的 strings.xml 文件,我想提出相当于 REST API,其中 LIST/EDIT,添加,删除。

现在,如果我们处理活动,我认为从外部处理我的 activity 的最简单方法是这样的:

Intent call = pm.getLaunchIntentForPackage("com.nohkumado.intstringsynchro");

随后进行一些 putExtra 调用以插入标识特定操作的标记,以及要执行的最终值...... 由 startActivity

完成

这样一来,默认的 activity 就启动了,不管它的名字和传递的意图如何,都可以在 MainActivity 的 onCreate 方法中读取。

为了实现我的 REST API,我尝试为我的应用创建 3 个入口点,每种访问类型一个,只有 LIST/EDIT 启动 UI,其他 2 个生成了一系列在后台执行工作的 Asynctasks。但这意味着,最终用户必须知道要处理哪些活动。

所以我恢复使用意图的 putExtra 和 token/value 对来实现我的 REST-like API.....

出于教育目的,我尝试了广播机制,优点是在客户端似乎没有崩溃的风险,不需要捕获 ActivityNotFound 异常,而且我的代码中有一个错字,我注意到 Intent activity 不需要绑定到我的实际应用程序,我可以选择任何我想要的名称。

为此,在客户端我需要:

String name="com.nohkumado.intstringsynchro.EDIT_STRINGXML";
Intent callIt = new Intent(name);
sendBroadcast(callIt);

但是在我的应用程序方面,我需要实现一个完整的 BroadCastreceiver....

另一方面,这个机制非常慢,给人一种整个运行很慢的感觉

如果我这次做对了,请指正我,如果有更好的方法来实现我的目标,我愿意接受建议,向其他人推荐那些 LIST/EDIT、ADD 和 REMOVE 功能?

the reports back an activity not found exception

显然,对于 com.nohkumado.intstringsynchro.EDIT_STRINGXML 的操作字符串,您没有带有 <intent-filter> 的 activity。您在问题中的清单肯定没有这样的activity。您在问题中的清单有一个 <receiver> 元素和一个奇数 <intent-filter> ,其中包括该操作。但是,<receiver><activity> 不是一回事。

要么更改您的代码以发送广播,要么将您的代码更改为具有带有该操作字符串的 activity。