我的程序中有一些功能我想公开,但我似乎没有让接收器工作。
我试过舱单/收货人:
<?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,另外两个生成一系列在后台执行工作的Asynctasks。但这意味着,最终用户必须知道要处理哪些活动。
因此,我恢复使用带有令牌/值对的intent的putExtra来实现我的REST-like API。。。。。
为了教育起见,我尝试了广播机制,优点是在客户端似乎没有崩溃的风险,不需要捕捉ActivityNotFound异常,而且,由于我代码中的拼写错误,我注意到意向活动不需要绑定到我的实际应用程序,我可以选择我想要的任何名称。
为此,在客户端,我需要:
String name="com.nohkumado.intstringsynchro.EDIT_STRINGXML";
Intent callIt = new Intent(name);
sendBroadcast(callIt);
但在我的应用程序方面,我需要实现一个完整的BroadCastreceiver。。。。
另一方面,这种机制非常缓慢,给整个操作带来了一种非常缓慢的感觉
如果我这次做对了,请纠正我,如果有更好的方法来实现我的目标,向其他人推荐这些列表/编辑、添加和删除功能,我愿意接受建议?
报告未找到异常的活动
显然,对于com.nohkumado.intstringsynchro.EDIT_STRINGXML
的操作字符串,您没有具有<intent-filter>
的活动。你在问题中的清单当然没有这样的活动。问题中的清单有一个<receiver>
元素和一个奇怪的<intent-filter>
,其中包括该操作。然而,<receiver>
和<activity>
不是一回事。
更改代码以发送广播,或者更改代码以具有该操作字符串的活动。