Android Activity 未找到异常和 BroadcastReceiver

问题描述 投票:0回答:1

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

我尝试了清单/接收器:

<?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"/>

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

现在作为另一个应用程序,我创建了一个小型测试器,它只有 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
}

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

好的,结束这个...... 首先,我并不完全意识到清单中的活动合约为任何人调用此活动提供了一种方式。

接下来,我有一个特定的应用程序,我想向其他人开放,这意味着编辑 Android 项目的 strings.xml 文件,并且我想提出相当于 REST API 的方案,包括 LIST/EDIT、ADD、DEL。

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

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

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

这样,默认活动就会启动,无论其名称和传递的意图如何,都可以在 MainActivity 的 onCreate 方法中读取。

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

所以我恢复使用意图的 putExtra 和令牌/值对来实现我的类似 REST 的 API......

为了教育目的,我尝试了广播机制的方法,优点是在客户端似乎没有崩溃的风险,不需要捕获 ActivityNotFound 异常,并且,从我的代码中的拼写错误,我注意到意图活动不需要绑定到我的实际应用程序,我可以选择任何我想要的名称。

为此,在客户端我需要:

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

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

另一方面,这个机制极其缓慢,让整个操作有一种很迟缓的感觉

如果这次我做对了,请纠正我,如果有更好的方法来实现我向其他人建议这些列表/编辑、添加和删除功能的目标,我愿意接受建议?

android broadcastreceiver activitynotfoundexception
1个回答
1
投票

报告返回未发现活动异常

显然,对于操作字符串

<intent-filter>
,您没有包含
com.nohkumado.intstringsynchro.EDIT_STRINGXML
的活动。你的问题清单中肯定没有这样的活动。您在问题中的清单有一个
<receiver>
元素,其中有一个奇怪的
<intent-filter>
,其中包括该操作。但是,
<receiver>
<activity>
不是同一件事。

更改代码以发送广播,或更改代码以使用该操作字符串进行活动。

© www.soinside.com 2019 - 2024. All rights reserved.