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
}

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

好的,关闭这个......首先,我并不完全意识到清单中的活动合同为任何人都可以调用此活动开辟了道路。

接下来,我有一个特定的应用程序,我想向其他人开放,这意味着编辑 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 个会产生一系列 Asynctasks 在后台完成工作。但这意味着,最终用户必须知道要处理的活动。

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

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

为此,在客户端我需要:

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

但在我的应用程序方面,我需要实现一个完整的广播接收器....

另一边,这个机制速度极慢,整个操作给人一种很慢的感觉

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

4

1 回答 1

1

报告返回活动未找到异常

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

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

于 2017-01-16T12:48:21.473 回答