如何通过单击通知从通知发送数据 android
How to send data from Notification with click Notification android
我是通过 volley 和服务创建代码的,每次查看用户是否在数据库的 table 中有新评论。现在代码可以正常工作,但我遇到了一个问题。
我让用户可以单击“通知”以移至我的应用程序中的另一个页面。我需要将用户的数据放入或传递到其他页面,但我做不到。
这是我的代码:
public void run_loop(){
String url = "https://xxxxxxxxxxxxxxx/Notification.php?Id="+Id;
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray jsonArray = response.getJSONArray("data");
JSONObject hit = jsonArray.getJSONObject(0);
String id = hit.getString("id");
String ma_id= hit.getString("ma_id");
Intent activityIntent = new Intent(MainActivity.this, MainActivityFargmainMarket.class);
activityIntent.putExtra("key", ma_id);
activityIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(MainActivity.this, 0, activityIntent, 0);
int lastThread = Integer.parseInt(String.valueOf(id));
if (app.getTotal_threadss() <lastThread) {
app.setTotal_threadss(lastThread);
Notification notification = new NotificationCompat.Builder(MainActivity.this, CHANNEL_1_ID)
.setSmallIcon(android.R.drawable.ic_popup_reminder)
.setContentTitle("title")
.setContentText("message")
.setAutoCancel(true)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setCategory(NotificationCompat.CATEGORY_MESSAGE)
.setContentIntent(contentIntent)
.build();
notificationManager.notify(1, notification);
}
} catch(JSONException e){
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(request);
正如您在我的代码中看到的那样,我通过这段代码尝试了帽子,但那不起作用
Intent activityIntent = new Intent(MainActivity.this, MainActivityFargmainMarket.class);
activityIntent.putExtra("key", markte_id);
activityIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(MainActivity.this, 0, activityIntent, 0);
我收到错误:
2020-07-27 21:16:40.216 9980-9980/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 9980
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapplication/com.example.myapplication.Fragmantmarket.MainActivityFargmainMarket}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2927)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2988)
at android.app.ActivityThread.-wrap14(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1631)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object reference
at com.example.myapplication.Fragmantmarket.MainActivityFargmainMarket.onCreate(MainActivityFargmainMarket.java:92)
at android.app.Activity.performCreate(Activity.java:6942)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2880)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2988)
at android.app.ActivityThread.-wrap14(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1631)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
收到数据如下:
Intent intents = getIntent();
String extraBody = intents.getStringExtra("key");
Log.i(TAG, "ddddfg"+extraBody.toString());
我也在这里尝试了很多文章:
how-to-send-parameters-from-a-notification-click-to-an-activity
how-to-set-click-listener-for-notification
它与我的代码相似,但无法正常工作。
您应该使用相同的密钥来传递和检索数据,因为您使用“密钥”传递数据,您应该使用“密钥”而不是“
activityIntent.putExtra("key", markte_id);
检索这个
String extraBody = intents.getStringExtra("key");
问题是空对象引用,
这意味着您有一个空对象,并且您正在尝试从中获取数据。
空对象可以是 response
public void onResponse(JSONObject response) {
或jsonArray
JSONArray jsonArray = response.getJSONArray("data");
或命中
JSONObject hit = jsonArray.getJSONObject(0);
错误日志中显示第 92 行,我看不到它在哪里,但你可以。
作为建议,请始终检查响应是否不为空,然后执行您的工作,否则抛出异常或 return 错误消息等。
问题在于您在 MainActivityFargmainMarket
class 中获取意图的方式。
这是您需要做的:
1 - 将 activityIntent
标志设置为 FLAG_ACTIVITY_SINGLE_TOP
,这是您已经设置的。
2 - 将 contentIntent
标志设置为 PendingIntent.FLAG_UPDATE_CURRENT
,否则它将为每个通知重用相同的额外内容。
3 - 覆盖 MainActivityFargmainMarket
class 中的 onNewIntent
方法以获取您发送的 activityIntent
Private Intent intent;
@Override
protected void onNewIntent(Intent _intent){
super.onNewIntent(_intent);
if(_intent == null)
Log.i(TAG, "_intent is null");
else {
intent = _intent;
getData();
}
private void getData(){
String extraBody = intent.getStringExtra("key");
Log.i(TAG, "ddddfg"+extraBody.toString());
}
在检查是否为空之前,不要尝试从意图中获取任何数据
我是通过 volley 和服务创建代码的,每次查看用户是否在数据库的 table 中有新评论。现在代码可以正常工作,但我遇到了一个问题。 我让用户可以单击“通知”以移至我的应用程序中的另一个页面。我需要将用户的数据放入或传递到其他页面,但我做不到。
这是我的代码:
public void run_loop(){
String url = "https://xxxxxxxxxxxxxxx/Notification.php?Id="+Id;
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray jsonArray = response.getJSONArray("data");
JSONObject hit = jsonArray.getJSONObject(0);
String id = hit.getString("id");
String ma_id= hit.getString("ma_id");
Intent activityIntent = new Intent(MainActivity.this, MainActivityFargmainMarket.class);
activityIntent.putExtra("key", ma_id);
activityIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(MainActivity.this, 0, activityIntent, 0);
int lastThread = Integer.parseInt(String.valueOf(id));
if (app.getTotal_threadss() <lastThread) {
app.setTotal_threadss(lastThread);
Notification notification = new NotificationCompat.Builder(MainActivity.this, CHANNEL_1_ID)
.setSmallIcon(android.R.drawable.ic_popup_reminder)
.setContentTitle("title")
.setContentText("message")
.setAutoCancel(true)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setCategory(NotificationCompat.CATEGORY_MESSAGE)
.setContentIntent(contentIntent)
.build();
notificationManager.notify(1, notification);
}
} catch(JSONException e){
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(request);
正如您在我的代码中看到的那样,我通过这段代码尝试了帽子,但那不起作用
Intent activityIntent = new Intent(MainActivity.this, MainActivityFargmainMarket.class);
activityIntent.putExtra("key", markte_id);
activityIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(MainActivity.this, 0, activityIntent, 0);
我收到错误:
2020-07-27 21:16:40.216 9980-9980/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 9980
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapplication/com.example.myapplication.Fragmantmarket.MainActivityFargmainMarket}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2927)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2988)
at android.app.ActivityThread.-wrap14(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1631)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object reference
at com.example.myapplication.Fragmantmarket.MainActivityFargmainMarket.onCreate(MainActivityFargmainMarket.java:92)
at android.app.Activity.performCreate(Activity.java:6942)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2880)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2988)
at android.app.ActivityThread.-wrap14(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1631)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
收到数据如下:
Intent intents = getIntent();
String extraBody = intents.getStringExtra("key");
Log.i(TAG, "ddddfg"+extraBody.toString());
我也在这里尝试了很多文章:
how-to-send-parameters-from-a-notification-click-to-an-activity
how-to-set-click-listener-for-notification
它与我的代码相似,但无法正常工作。
您应该使用相同的密钥来传递和检索数据,因为您使用“密钥”传递数据,您应该使用“密钥”而不是“
activityIntent.putExtra("key", markte_id);
检索这个
String extraBody = intents.getStringExtra("key");
问题是空对象引用, 这意味着您有一个空对象,并且您正在尝试从中获取数据。
空对象可以是 response
public void onResponse(JSONObject response) {
或jsonArray
JSONArray jsonArray = response.getJSONArray("data");
或命中
JSONObject hit = jsonArray.getJSONObject(0);
错误日志中显示第 92 行,我看不到它在哪里,但你可以。
作为建议,请始终检查响应是否不为空,然后执行您的工作,否则抛出异常或 return 错误消息等。
问题在于您在 MainActivityFargmainMarket
class 中获取意图的方式。
这是您需要做的:
1 - 将 activityIntent
标志设置为 FLAG_ACTIVITY_SINGLE_TOP
,这是您已经设置的。
2 - 将 contentIntent
标志设置为 PendingIntent.FLAG_UPDATE_CURRENT
,否则它将为每个通知重用相同的额外内容。
3 - 覆盖 MainActivityFargmainMarket
class 中的 onNewIntent
方法以获取您发送的 activityIntent
Private Intent intent;
@Override
protected void onNewIntent(Intent _intent){
super.onNewIntent(_intent);
if(_intent == null)
Log.i(TAG, "_intent is null");
else {
intent = _intent;
getData();
}
private void getData(){
String extraBody = intent.getStringExtra("key");
Log.i(TAG, "ddddfg"+extraBody.toString());
}
在检查是否为空之前,不要尝试从意图中获取任何数据