私のプログラムにはいくつかの機能がありますが、私は公開したいのですが、受信機を動作させていないようです。Androidのアクティビティが見つかりませんでした例外とBroadcastReceiver
私はマニフェスト/レシーバを試してみました:
<?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)を試してみましたはずです。
これを閉じるには... まず、マニフェスト内のアクティビティ契約が誰にでもこのアクティビティを呼び出す方法を開いていることを完全に認識していませんでした。
次に、特定のアプリケーションがあります。これは他の人に開かれたい、アンドロイドプロジェクトのstrings.xmlファイルを編集することを意味しています.LIST/EDIT、ADD 、DEL。
は今、私たちが活動して作業する場合、外部からの私の活動のハンドルを取得する最も簡単な方法があり、私はこのような、と思います:いくつかのputExtra続い
Intent call = pm.getLaunchIntentForPackage("com.nohkumado.intstringsynchro");
はAを識別するトークンを挿入するために呼び出します具体的なアクション、そして最終的な値は上の実行に.... startActivity
この方法で仕上げ を、デフォルトのアクティビティのonCreateはで読むことができる、その名前に関係なく、開始、および意図が渡されますMainActivityのメソッド。
私はREST APIを実装するために、アプリケーションの3つのエントリポイントを作成しようとしましたが、アクセスの種類ごとに1つずつ、LIST/EDITはUIを起動し、2つは一連のAsynctaskを生成してバックグラウンド。しかし、これは最終的なユーザーが取り組むべき活動を知る必要があることを意味しています。
だから私は、私は、ブロードキャスト・メカニズムの上に道をしようと試み教育の便宜上.....私のRESTのようなAPIを実装するためにトークン/値のペアで
を意図のputExtraを使用してに戻りましたクライアント側ではクラッシュの危険性がなく、ActivityNotFound例外をキャッチする必要はなく、コードのタイプミスから、インテントアクティビティが実際のアプリケーションにバインドされる必要がないことに気付きました。私が望む任意の名前を選ぶことができます。このため
、クライアント側では私がするために必要な:
String name="com.nohkumado.intstringsynchro.EDIT_STRINGXML";
Intent callIt = new Intent(name);
sendBroadcast(callIt);
が、私のアプリ側で私は完全BroadCastreceiverを実装する必要があります....
は、他の側では、このメカニズムは、全体の動作に非常にだるい
を与え、非常に遅かった私は右のこの時間はそれを得たなら、私を修正し、そこまでのより良い方法ならば、私は提案を開いていてください。他の人にLIST/EDIT、ADD、およびREMOVE機能を提案する私の目標を達成する
私は理解している問題があります....まず、あなたは奇妙に何を呼びますか?私はドキュメンテーションからこれをとったのですか?そして、私は外部のアプリケーションから編集/追加/削除の同等のものを呼びたいと思いますか?インテントをアクティビティやブロードキャストに渡すことによって?彼らは同じことをしているように見える? –
@ノーグママド:「あなたは何が奇妙なのですか? - ' 'の' 'は' '、特に' DEFAULT'を使うことはめったにありません。何らかの理由で、 'startActivity()'を呼び出すと、他のカテゴリが指定されていなければAndroidは自動的に 'DEFAULT'を' Intent'に追加しますが、 'sendBroadcast()'ではそれを行いません。 "それは良いですか?" - ユーザーにUIを提示する場合は、アクティビティを使用します。ユーザーにUIを提示しない場合は、アクティビティを使用しないでください(ブロードキャストは「良い」回答ではないかもしれませんが)。 –
CommonsWare
私はこの答えを受け入れるだろう、あなたが意味するものを理解するにはあまりにも意味がわからない、単純な変更startActivityはsendBroadcastが正しいトラックにもっと速く送るだろう、英語以外のネイティブスピーカーへの腐食性の返信が現れるかもしれない彼らはあなたが最初に何を意味しているかを最終的に理解した後に彼らに唯一の方法を提供します.... –