チュートリアルで見つけたコードを自分用に変換しようとしています。もともと、ユーザーがアプリで生成した通知をクリックすると、コードがシステムの連絡先リストを起動しました。連絡先リストを起動する代わりに、自分のActivity
を起動しようとしていますが、機能しません。具体的には、何も起こりません。エラーはなく、私のActivity
もロードされません。クリックすると通知ウィンドウが消え、元のActivity
が引き続き表示されます。
これが私のコードです:
public class MyBroadcastReceiver extends BroadcastReceiver {
private NotificationManager mNotificationManager;
private int SIMPLE_NOTFICATION_ID;
public void onReceive(Context context, Intent intent){
Bundle extras = intent.getExtras();
String deal = (String) extras.get("Deal");
String title = "Deal found at " + (String) extras.get("LocationName");
mNotificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notifyDetails = new Notification(R.drawable.icon, title,System.currentTimeMillis());
Class ourClass;
try {
ourClass = Class.forName("com.kjdv.gpsVegas.ViewTarget");
Intent startMyActivity = new Intent(context, ourClass);
PendingIntent myIntent = PendingIntent.getActivity(context, 0,startMyActivity, 0);
notifyDetails.setLatestEventInfo(context, title, deal, myIntent);
notifyDetails.flags |= Notification.FLAG_AUTO_CANCEL;
notifyDetails.flags |= Notification.DEFAULT_SOUND;
mNotificationManager.notify(SIMPLE_NOTFICATION_ID, notifyDetails);
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
これはAndroidManifext.xml
ファイルの私のエントリです...
<activity Android:name=".ViewTarget" Android:label="@string/app_name" >
<intent-filter>
<action Android:name="com.kjdv.gpsVegas.ViewTarget" />
<category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>
</activity>
そして、これは私が起動したい私のActivity
です...
public class ViewTarget extends ListActivity {
public ListAdapter getListAdapter() {
return super.getListAdapter();
}
public ListView getListView() {
return super.getListView();
}
public void setListAdapter(ListAdapter adapter) {
super.setListAdapter(adapter);
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.locations);
Log.v("db", "Inside ViewTarget");
}
}
私は問題を理解しました。マニフェストファイルのアクティビティ宣言にパッケージ名を含めるのを忘れました。
違う:
activity Android:name=".ViewTarget" Android:label="@string/app_name"
正しい:
activity Android:name="com.kjdv.gpsVegas.ViewTarget" Android:label="@string/app_name"
どのAndroidバージョンを実行していますか?代わりにNotificationCompatを使用してみてください。このクラスは最新のサポートパッケージに含まれています。
Intent notificationIntent = new Intent(context, ViewTarget.class);
PendingIntent contentIntent = PendingIntent.getActivity(context,
0, notificationIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
NotificationManager nm = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
Resources res = context.getResources();
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setContentIntent(contentIntent)
.setSmallIcon(R.drawable.app_icon)
.setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.app_icon))
.setTicker(payload)
.setWhen(System.currentTimeMillis())
.setAutoCancel(true)
.setContentTitle("Message")
.setContentText(payload);
Notification n = builder.getNotification();
n.defaults |= Notification.DEFAULT_ALL;
nm.notify(0, n);
編集:これは古いスレッド/質問であることを知っていますが、この回答は、通知をタップしたときにアクティビティを表示するのに役立ちました。これが機能しない人にとっては、おそらくマニフェストにアクティビティを「登録」していないためです。例えば:
<activity
Android:name="com.package.name.NameOfActivityToLaunch"
Android:label="Title of Activity" >
<intent-filter>
<action Android:name="com.package.name.NAMEOFACTIVITYTOLAUNCH" />
<category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>
</activity>
そして、うまくいけば、これはうまくいくはずです。それが役に立てば幸い...
インテントのアクションとカテゴリを設定する必要があります。
Intent startMyActivity = new Intent(context, ourClass);
startMyActivity .setAction(Intent.ACTION_MAIN);
startMyActivity .addCategory(Intent.CATEGORY_LAUNCHER);
できます
インテントフィルターを削除してみると、次のようになります。
_<activity Android:name=".ViewTarget" Android:label="@string/app_name" />
_
また、このコードが機能するかどうかはわかりません:
ourClass = Class.forName("com.kjdv.gpsVegas.ViewTarget"); Intent startMyActivity = new Intent(context, ourClass);
代わりに次のようにしてみてください:
Intent startMyActivity = new Intent(context, ViewTarget.class);
このコードを確認してください
public class TestActivity extends Activity {
private static final int UNIQUE_ID = 882;
public static NotificationManager nm;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Intent navigationIntent = new Intent();
navigationIntent.setClass(classname.this, MainActivity.class);
PendingIntent pi = PendingIntent.getActivity(this, 0, navigationIntent,
0);
String body = "New notificattion added!!!";
String title = "Notification";
Notification n = new Notification(R.drawable.icon, body,
System.currentTimeMillis());
//this is for giving number on the notification icon
n.number = Integer.parseInt(responseText);
n.setLatestEventInfo(this, title, body, pi);
n.defaults = Notification.DEFAULT_ALL;
nm.notify(UNIQUE_ID, n);
Activity
からIntent
を起動するには、フラグを追加する必要があります。
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
これは、Intent
のコンストラクターでクラスを宣言した場合にも当てはまります。