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。
我的程序中有一些我想公开的功能,但我似乎没有让接收器工作。
我尝试了 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。