- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我已经在我的应用程序中实现了 Onesignal 推送通知,但是当我的应用程序关闭时我没有收到推送通知。这是我的实现代码。
LoginActivity.java
public class LoginActivity extends BaseActivity {
private static final int REQUEST_MARK_READ = 165;
private ListView userListView;
private static final String TAG = LoginActivity.class.getSimpleName();
private static ArrayList<String> userids=new ArrayList<>();
private static boolean activityStarted;
public static void start(Context context) {
Intent intent = new Intent(context, LoginActivity.class);
context.startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (activityStarted && getIntent() != null && (getIntent().getFlags() & Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0)
{
finish();
return;
}
activityStarted = true;
setContentView(R.layout.activity_login);
if (SharedPreferencesUtil.hasQbUser()) {
try {
Onesignal();
recreateChatSession();
} catch (Exception e) {
e.printStackTrace();
}
return;
}
Onesignal();
userListView = _findViewById(R.id.list_login_users);
TextView listHeader = (TextView) LayoutInflater.from(this)
.inflate(R.layout.include_list_hint_header, userListView, false);
listHeader.setText(R.string.login_select_user_for_login);
userListView.addHeaderView(listHeader, null, false);
userListView.setOnItemClickListener(new OnUserLoginItemClickListener());
buildUsersList();
}
public void Onesignal()
{
/*5 oct 2016*/
OneSignal.idsAvailable(new OneSignal.IdsAvailableHandler() {
@Override
public void idsAvailable(String userId, String registrationId) {
registrationId= NotificationUtilities.getRegistrationId(getApplicationContext());
userids.add(userId);
String text = "OneSignal UserID:\n" + userId + "\n\n";
// try {
// OneSignal.postNotification(new JSONObject("{'contents': {'en':'"+ PrivateChatImpl.chat_message +"'}, 'include_player_ids': ['" + userId + "']}"), null);
// } catch (JSONException e) {
// e.printStackTrace();
// }
try {
OneSignal.postNotification(new JSONObject("{'contents': {'en':'" + PrivateChatImpl.chat_message.size() + "','en':'Unread Messages'}, 'include_player_ids': ['" + userId + "']}"),
new OneSignal.PostNotificationResponseHandler() {
@Override
public void onSuccess(JSONObject response) {
Log.i("OneSignalExample", "postNotification Success: " + JsonResponse());
}
@Override
public void onFailure(JSONObject response) {
Log.e("OneSignalExample", "postNotification Failure: " + JsonResponse());
}
});
} catch (JSONException e) {
e.printStackTrace();
}
if (registrationId != null)
text += "Google Registration Id:\n" + registrationId;
else
text += "Google Registration Id:\nCould not subscribe for push";
}
});
/*5 oct 2016*/
}
public String JsonResponse()
{
String jsonResponse = null;
try {
URL url = new URL("https://onesignal.com/api/v1/notifications");
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setUseCaches(false);
con.setDoOutput(true);
con.setDoInput(true);
con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
con.setRequestProperty("Authorization", "Basic NGEwMGZmMjItY2NkNy0xMWUzLTk5ZDUtMDAwYzI5NDBlNjJj");
con.setRequestMethod("POST");
String strJsonBody = "{"
+ "\"app_id\": \"05b29c2d-ea2a-487f-88e8-63438bd58831\","
+ "\"include_player_ids\": "+userids+","
+ "\"data\": {\"foo\": \"bar\"},"
+ "\"contents\": {\"en\": \"English Message\"}"
+ "}";
System.out.println("strJsonBody:\n" + strJsonBody);
byte[] sendBytes = strJsonBody.getBytes("UTF-8");
con.setFixedLengthStreamingMode(sendBytes.length);
OutputStream outputStream = con.getOutputStream();
outputStream.write(sendBytes);
int httpResponse = con.getResponseCode();
System.out.println("httpResponse: " + httpResponse);
if ( httpResponse >= HttpURLConnection.HTTP_OK
&& httpResponse < HttpURLConnection.HTTP_BAD_REQUEST) {
Scanner scanner = new Scanner(con.getInputStream(), "UTF-8");
jsonResponse = scanner.useDelimiter("\\A").hasNext() ? scanner.next() : "";
scanner.close();
}
else {
Scanner scanner = new Scanner(con.getErrorStream(), "UTF-8");
jsonResponse = scanner.useDelimiter("\\A").hasNext() ? scanner.next() : "";
scanner.close();
}
System.out.println("jsonResponse:\n" + jsonResponse);
} catch(Throwable t) {
t.printStackTrace();
}
return jsonResponse;
}
MyShopApplication.java
public class MyShopApplication extends Application {
private Tracker mTracker;
private static MyShopApplication INSTANCE;
final GooglePlayServicesHelper googlePlayServicesHelper = new GooglePlayServicesHelper();
@Override
public void onCreate() {
super.onCreate();
INSTANCE=this;
HttpService.getInstance().setUp(getApplicationContext());
FacebookSdk.sdkInitialize(getApplicationContext());
sharedPreferences = getSharedPreferences(AppConstants.USER_PREFERENCES, Context.MODE_PRIVATE);
// OneSignal.startInit(this).init();
// OneSignal.enableNotificationsWhenActive(true);
// OneSignal.setLogLevel(OneSignal.LOG_LEVEL.DEBUG, OneSignal.LOG_LEVEL.DEBUG);
/* 5 october 2016 */
// OneSignal.setLogLevel(OneSignal.LOG_LEVEL.DEBUG, OneSignal.LOG_LEVEL.WARN);
OneSignal.startInit(this)
.setNotificationOpenedHandler(new ExampleNotificationOpenedHandler())
.setNotificationReceivedHandler(new ExampleNotificationReceivedHandler())
.autoPromptLocation(true)
.inFocusDisplaying(OneSignal.OSInFocusDisplayOption.None)
.disableGmsMissingPrompt(true)
.init();
/*11 oct 2016*/
OneSignal.clearOneSignalNotifications();
OneSignal.syncHashedEmail(sharedPreferences.getString(AppConstants.USER_EMAIL, ""));
/*11 oct 2016*/
/*Registering for push notifications happens automatically on Android using OneSignal.
You don't need to write anything!*/
/* 5 oct 2016*/
Crashlytics crashlyticsKit = new Crashlytics.Builder()
.core(new CrashlyticsCore.Builder()/*.disabled(BuildConfig.DEBUG)*/.build())
.build();
Fabric.with(this, crashlyticsKit, new Crashlytics(), new Crashlytics());
GoogleAnalytics analytics = GoogleAnalytics.getInstance(this);
analytics.setLocalDispatchPeriod(15);//setting dispatching to 15mins, Default is 30 mins
// To enable debug logging use: adb shell setprop log.tag.GAv4 DEBUG
mTracker = analytics.newTracker(R.xml.global_tracker);
mTracker.enableAutoActivityTracking(true);
}
/* 5 october 2016 */
private class ExampleNotificationOpenedHandler implements OneSignal.NotificationOpenedHandler {
// This fires when a notification is opened by tapping on it.
@Override
public void notificationOpened(OSNotificationOpenResult result) {
OSNotificationAction.ActionType actionType = result.action.type;
JSONObject data = result.notification.payload.additionalData;
String customKey;
if (data != null) {
customKey = data.optString("customkey", null);
if (customKey != null)
Log.i("OneSignalExample", "customkey set with value: " + customKey);
}
if (actionType == OSNotificationAction.ActionType.ActionTaken)
Log.i("OneSignalExample", "Button pressed with id: " + result.action.actionID);
// The following can be used to open an Activity of your choice.
Intent intent = new Intent(getApplicationContext(),
com.baniaclothing.rang.quickblox.ui.activity.LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
// Add the following to your AndroidManifest.xml to prevent the launching of your main Activity
// if you are calling startActivity above.
/*
<application ...>
<meta-data android:name="com.onesignal.NotificationOpened.DEFAULT" android:value="DISABLE" />
</application>
*/
}
}
/* 5 october 2016 */
/* 5 october 2016 */
private class ExampleNotificationReceivedHandler implements OneSignal.NotificationReceivedHandler {
@Override
public void notificationReceived(OSNotification notification) {
JSONObject data = notification.payload.additionalData;
String customKey;
if (data != null) {
customKey = data.optString("customkey", null);
if (customKey != null)
Log.i("OneSignalExample", "customkey set with value: " + customKey);
}
}
}
/* 5 october 2016 */
}
当我点击通知时,我的 LoginActivity.java 会启动,当我打开我的应用程序时,会显示通知,但当我关闭我的应用程序时,不会显示通知。
list 文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.baniaclothing.rang" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- Creates a custom permission so only this app can receive its messages. -->
<permission
android:name="com.baniaclothing.rang.quickblox.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.baniaclothing.rang.permission.C2D_MESSAGE" />
<!-- This app has permission to register and receive data message. -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<application
android:name=".MyShopApplication"
android:allowBackup="true"
android:icon="@mipmap/app_icon"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<meta-data
android:name="com.onesignal.BadgeCount"
android:value="DISABLE" />
<meta-data
android:name="com.onesignal.NotificationOpened.DEFAULT"
android:value="DISABLE" />
<activity
android:name=".quickblox.ui.activity.LoginActivity"
android:label="@string/login_title"
android:screenOrientation="portrait" />
<service
android:name=".NotificationExtenderExample"
android:exported="false">
<intent-filter>
<action android:name="com.onesignal.NotificationExtender" />
</intent-filter>
</service>
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
</application>
</manifest>
NotificationExtenderExample
public class NotificationExtenderExample extends NotificationExtenderService {
final static String GROUP_KEY_EMAILS = "group_key_emails";
@Override
protected boolean onNotificationProcessing(OSNotificationReceivedResult receivedResult) {
OverrideSettings overrideSettings = new OverrideSettings();
overrideSettings.extender = new NotificationCompat.Extender() {
@Override
public NotificationCompat.Builder extend(NotificationCompat.Builder builder) {
// Sets the background notification color to Green on Android 5.0+ devices.
return builder.setColor(new BigInteger("FF00FF00", 16).intValue())
.setGroup(GROUP_KEY_EMAILS)
.setGroupSummary(true);
}
};
OSNotificationDisplayedResult displayedResult = displayNotification(overrideSettings);
Log.d("OneSignalExample", "Notification displayed with id: " + displayedResult.androidNotificationId);
return true;
}
}
逻辑猫
10-14 08:56:55.683 4581-4581/com.baniaclothing.rang I/REgistraationId:: dKV-blhGGI4:APA91bFpbOMERKf_IlZ3JI9P2ngOY5EXFF7kaUyuuHSL1SGsi5qLPDGDoyJPKyA1OvK5Jd_4TfHjWQJjO-SqQY5g7tTY2ThGOusbBJwH-8-IDhxsqYeUJzvfQtJl8cvW9qOhsnTnswp7
10-14 08:56:56.287 4581-6086/com.baniaclothing.rang I/System.out: strJsonBody:
10-14 08:56:56.287 4581-6086/com.baniaclothing.rang I/System.out: {"app_id": "000000000-0000-0000-0000-0000000000","include_player_ids": [ecbef570-f713-4fb0-ada2-e7b9b864344b],"data": {"foo": "bar"},"contents": {"en": "English Message"}}
10-14 08:56:56.686 4581-6086/com.baniaclothing.rang I/System.out: httpResponse: 400
10-14 08:56:56.692 4581-6086/com.baniaclothing.rang I/System.out: jsonResponse:
10-14 08:56:56.692 4581-6086/com.baniaclothing.rang I/System.out: {"status":400,"error":"There was a problem in the JSON you submitted: unexpected character at line 1, column 74 [parse.c:652]"}
10-14 08:56:56.692 4581-6086/com.baniaclothing.rang I/OneSignalExample: postNotification Success: {"status":400,"error":"There was a problem in the JSON you submitted: unexpected character at line 1, column 74 [parse.c:652]"}
注意-请忽略 java 文件中不必要的方法调用。我刚刚展示了与 OneSignal 推送通知相关的代码。为什么我的应用关闭时没有收到通知?
最佳答案
如果您通过将应用程序置于“强制停止”状态来关闭您的应用程序,则不会收到大多数事件,包括用于推送通知的 GCM/FCM 消息。可以通过以下方式将应用置于此状态。
要确认您的应用状态是否存在问题,请发送一些通知并检查以下 GCM logcat 条目。
W/GCM-DMM: broadcast intent callback: result=CANCELLED forIntent { act=com.google.android.c2dm.intent.RECEIVE pkg=com.onesignal.example (has extras) }
一些设备制造商会将应用列入白名单,以免进入强制关闭状态。例如 Gmail 和 Whatsapp。
参见 OneSignal's documentation了解更多详情。
关于android - 如何在应用程序关闭时获取 OneSignal 推送通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40025447/
我最近在/ drawable中添加了一些.gifs,以便可以将它们与按钮一起使用。这个工作正常(没有错误)。现在,当我重建/运行我的应用程序时,出现以下错误: Error: Gradle: Execu
Android 中有返回内部存储数据路径的方法吗? 我有 2 部 Android 智能手机(Samsung s2 和 s7 edge),我在其中安装了一个应用程序。我想使用位于这条路径中的 sqlit
这个问题在这里已经有了答案: What's the difference between "?android:" and "@android:" in an android layout xml f
我只想知道 android 开发手机、android 普通手机和 android root 手机之间的实际区别。 我们不能从实体店或除 android marketplace 以外的其他地方购买开发手
自Gradle更新以来,我正在努力使这个项目达到标准。这是一个团队项目,它使用的是android-apt插件。我已经进行了必要的语法更改(编译->实现和apt->注释处理器),但是编译器仍在告诉我存在
我是android和kotlin的新手,所以请原谅要解决的一个非常简单的问题! 我已经使用导航体系结构组件创建了一个基本应用程序,使用了底部的导航栏和三个导航选项。每个导航选项都指向一个专用片段,该片
我目前正在使用 Facebook official SDK for Android . 我现在正在使用高级示例应用程序,但我不知道如何让它获取应用程序墙/流/状态而不是登录的用户。 这可能吗?在那种情
我在下载文件时遇到问题, 我可以在模拟器中下载文件,但无法在手机上使用。我已经定义了上网和写入 SD 卡的权限。 我在服务器上有一个 doc 文件,如果用户单击下载。它下载文件。这在模拟器中工作正常但
这个问题在这里已经有了答案: What is the difference between gravity and layout_gravity in Android? (22 个答案) 关闭 9
任何人都可以告诉我什么是 android 缓存和应用程序缓存,因为当我们谈论缓存清理应用程序时,它的作用是,缓存清理概念是清理应用程序缓存还是像内存管理一样主存储、RAM、缓存是不同的并且据我所知,缓
假设应用程序 Foo 和 Eggs 在同一台 Android 设备上。任一应用程序都可以获取设备上所有应用程序的列表。一个应用程序是否有可能知道另一个应用程序是否已经运行以及运行了多长时间? 最佳答案
我有点困惑,我只看到了从 android 到 pc 或者从 android 到 pc 的例子。我需要制作一个从两部手机 (android) 连接的 android 应用程序进行视频聊天。我在想,我知道
用于使用 Android 以编程方式锁定屏幕。我从 Stackoverflow 之前关于此的问题中得到了一些好主意,并且我做得很好,但是当我运行该代码时,没有异常和错误。而且,屏幕没有锁定。请在这段代
文档说: android:layout_alignParentStart If true, makes the start edge of this view match the start edge
我不知道这两个属性和高度之间的区别。 以一个TextView为例,如果我将它的layout_width设置为wrap_content,并将它的width设置为50 dip,会发生什么情况? 最佳答案
这两个属性有什么关系?如果我有 android:noHistory="true",那么有 android:finishOnTaskLaunch="true" 有什么意义吗? 最佳答案 假设您的应用中有
我是新手,正在尝试理解以下 XML 代码: 查看 developer.android.com 上的文档,它说“starStyle”是 R.attr 中的常量, public static final
在下面的代码中,为什么当我设置时单选按钮的外观会发生变化 android:layout_width="fill_parent" 和 android:width="fill_parent" 我说的是
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
假设我有一个函数 fun myFunction(name:String, email:String){},当我调用这个函数时 myFunction('Ali', 'ali@test.com ') 如何
我是一名优秀的程序员,十分优秀!