自定义的 BroadcastReceiver:
public class DemoNotificationReceiver extends PushMessageReceiver {
@Override
public boolean onNotificationMessageArrived(Context context, PushNotificationMessage message) {
return false;
}
@Override
public boolean onNotificationMessageClicked(Context context, PushNotificationMessage message) {
return false;
}
}
注册到应用的 AndroidManifestxml 里面:
<receiver
android:exported="true"
android:name="您自定义的 broadcastReceiver 类名">
<intent-filter>
<action android:name="iorongpushintentMESSAGE_ARRIVED" />
<action android:name="iorongpushintentMI_MESSAGE_ARRIVED" />
<action android:name="iorongpushintentMESSAGE_CLICKED" />
<action android:name="iorongpushintentMI_MESSAGE_CLICKED" />
</intent-filter>
</receiver>
onNotificationMessageArrived 用来接收服务器发来的通知栏消息(消息到达客户端时触发),默认return false,通知消息会以融云 SDK 的默认形式展现。如果需要自定义通知栏的展示,在这里实现自己的通知栏展现代码,同时 return true 即可。
onNotificationMessageClicked 是在用户点击通知栏消息时触发 (注意:如果自定义了通知栏的展现,则不会触发),默认 return false 。如果需要自定义点击通知时的跳转,return true 即可。融云 SDK 默认跳转规则如下
只有一个联系人发来一条或者多条消息时,会通过 intent 隐式启动会话 activity,intent 的 uri 如下:
Intent intent = new Intent();
intentsetFlags(IntentFLAG_ACTIVITY_NEW_TASK);
UriBuilder builder = Uriparse("rong://" + thisgetPackageName())buildUpon();
builderappendPath("conversation")appendPath(typegetName())
appendQueryParameter("targetId", targetId)
appendQueryParameter("title", targetName);
uri = builderbuild();
intentsetData(uri);
startActivity(intent);
如果你的 AndroidManifestxml 里面配置 A activity 拦截了这个 intent ,那在点击这条通知栏消息 时就会启动 activity A 。
<activity
android:name="A"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize">
<intent-filter>
<action android:name="androidintentactionVIEW" />
<category android:name="androidintentcategoryDEFAULT" />
<data
android:host="你的包名"
android:pathPrefix="/conversation/"
android:scheme="rong" />
</intent-filter>
</activity>
多个联系人发来多条消息时,通过 intent 隐式启动会话列表 activity,intent 的 uri 配置如下:
Intent intent = new Intent();
intentsetFlags(IntentFLAG_ACTIVITY_NEW_TASK);
UriBuilder builder = Uriparse("rong://" + thisgetPackageName())buildUpon();
builderappendPath("conversationlist");
Uri uri = builderbuild();
intentsetData(uri);
startActivity(intent);
如果你的 AndroidManifestxml 里面配置 B activity 拦截了这个 intent,那在点击这条通知栏消息 时就会启动 activity B。
<activity
android:name="B"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize">
<intent-filter>
<action android:name="androidintentactionVIEW" />
<category android:name="androidintentcategoryDEFAULT" />
<data
android:host="你的包名"
android:path="/conversationlist"
android:scheme="rong" />
</intent-filter>
</activity>
可以在融云开发者后台广播推送-广播消息-推送中,发起远程推送。
点击推送消息时会触发出如下 action 事件:
Intent intent = new Intent();
intentsetFlags(intentFLAG_ACTIVITY_NEW_TASK);
UriBuilder uriBuilder = Uriparse("rong://" + thisgetPackageName())buildUpon();
uriBuilderappendPath("push_message")
appendQueryParameter("targetId", targetId)
appendQueryParameter("pushData", pushData)
appendQueryParameter("pushId", pushId)
appendQueryParameter("extra", extra);
startActivity(intent);
如果你的 AndroidManifestxml 里面配置了 C activity 拦截这个 action, 那么点击时就会跳转到 activity C。
<activity
android:name="C"
android:launchMode="singleTask"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="androidintentactionVIEW" />
<category android:name="androidintentcategoryDEFAULT" />
<data
android:host="你的包名"
android:pathPrefix="/push_message"
android:scheme="rong" />
</intent-filter>
</activity>
通过以上步骤,您已完成了融云推送服务的集成。
让系统处理崩溃,然后把错误日志上传到服务器并且服务只能运行2秒钟,如果2秒钟错误日志没有上传到服务器,那么这个错误信息就不要了。然后再停止服务,在服务销毁的时候同时销毁进程。
核心代码:
public int onStartCommand(Intent intent, int flags, int startId) { stopDelayed = intentgetLongExtra("Delayed", 2000); PackageName = intentgetStringExtra("PackageName"); expection = intentgetStringExtra("exception"); try { //这里上传崩溃日志 } catch (javalangException e) { eprintStackTrace(); } handlerpostDelayed(new Runnable() { @Override public void run() {/ Intent LaunchIntent = getPackageManager()getLaunchIntentForPackage(PackageName); startActivity(LaunchIntent);/ KillSelfServicethisstopSelf(); //androidosProcesskillProcess(androidosProcessmyPid()); } }, stopDelayed); return superonStartCommand(intent, flags, startId);}
@Overridepublic void onDestroy() { superonDestroy(); Logi(TAG, "onDestroy: "); androidosProcesskillProcess(androidosProcessmyPid());}
在70以下中打开文件时,通过intent调用系统安装得人软件打开文件就好了,但是在android70及以上的机子上这么做会报androidosFileUriExposedException错误,
1)读取SD卡
2)动态申请权限
//设备API大于60时,主动申请权限(读取文件的权限)
public static void requestPermission(Activity context) {
if (BuildVERSIONSDK_INT >= BuildVERSION_CODESM) {
if (ContextCompatcheckSelfPermission(context, ManifestpermissionWRITE_EXTERNAL_STORAGE)
!= PackageManagerPERMISSION_GRANTED) {
ActivityCompatrequestPermissions(context, new String[]{ManifestpermissionWRITE_EXTERNAL_STORAGE,
ManifestpermissionREAD_EXTERNAL_STORAGE}, 0);
}
}
}
3)读取文件
intent = OpenFileUtilopenFile(filePath+"/"+FileName+""+end);
使用OpenFileUtil这个。链接: >功能说明JPush SDK 收到推送,通过广播的方式,转发给开发者App,这样开发者就可以灵活地进行处理。这个动作不是必须的。用户有需要才定义 Receiver 类来处理 SDK过来的广播。如果不做这个动作,即不写自定义 Receiver,也不在 AndroidManifestxml 里配置这个 Receiver,则默认的行为是:接收到推送的自定义消息,则没有被处理可以正常收到通知,用户点击打开应用主界面接受广播如果全部类型的广播都接收,则需要在 AndroidManifestxml 里添加如下的配置信息:<receiver android:name="Your Receiver" android:enabled="true"> <intent-filter> <action android:name="cnjpushandroidintentREGISTRATION" /> <action android:name="cnjpushandroidintentMESSAGE_RECEIVED" /> <action android:name="cnjpushandroidintentNOTIFICATION_RECEIVED" /> <action android:name="cnjpushandroidintentNOTIFICATION_OPENED" /> <category android:name="You package Name" /> </intent-filter></receiver>每个 Receiver action 详细解释如下。Action - cnjpushandroidintentREGISTRATIONSDK 向 JPush Server 注册所得到的注册 ID 。一般来说,可不处理此广播信息。要深入地集成极光推送,开发者想要自己保存App用户与JPush 用户关系时,则接受此广播,取得 Registration ID 并保存与App uid 的关系到开发者自己的应用服务器上。使用极光推送提供的别名与标签功能,是更加简单轻便的绑定App用户与JPush用户的方式,请参考文档:别名与标签使用教程。Intent 参数JPushInterfaceEXTRA_REGISTRATION_IDSDK 向 JPush Server 注册所得到的注册 全局唯一的 ID ,可以通过此 ID 向对应的客户端发送消息和通知。Bundle bundle = intentgetExtras();String title = bundlegetString(JPushInterfaceEXTRA_REGISTRATION_ID);Action - cnjpushandroidintentMESSAGE_RECEIVED收到了自定义消息 Push 。SDK 对自定义消息,只是传递,不会有任何界面上的展示。如果开发者想推送自定义消息 Push,则需要在 AndroidManifestxml 里配置此 Receiver action,并且在自己写的 BroadcastReceiver 里接收处理。Intent 参数JPushInterfaceEXTRA_TITLE保存服务器推送下来的消息的标题。对应 API 消息内容的 title 字段。对应 Portal 推送消息界面上的“标题”字段(可选)Bundle bundle = intentgetExtras();String title = bundlegetString(JPushInterfaceEXTRA_TITLE);JPushInterfaceEXTRA_MESSAGE保存服务器推送下来的消息内容。对应 API 消息内容的 message 字段。对应 Portal 推送消息界面上的"消息内容”字段。 Bundle bundle = intentgetExtras();String message = bundlegetString(JPushInterfaceEXTRA_MESSAGE);JPushInterfaceEXTRA_EXTRA保存服务器推送下来的附加字段。这是个 JSON 字符串。对应 API 消息内容的 extras 字段。对应 Portal 推送消息界面上的“自定义内容”。Bundle bundle = intentgetExtras();String extras = bundlegetString(JPushInterfaceEXTRA_EXTRA);JPushInterfaceEXTRA_CONTENT_TYPE保存服务器推送下来的内容类型。对应 API 消息内容的 content_type 字段。Bundle bundle = intentgetExtras();String type = bundlegetString(JPushInterfaceEXTRA_CONTENT_TYPE);JPushInterfaceEXTRA_RICHPUSH_FILE_PATHSDK 140 以上版本支持。富媒体通消息推送下载后的文件路径和文件名。Bundle bundle = intentgetExtras();String file = bundlegetString(JPushInterfaceEXTRA_RICHPUSH_FILE_PATH);JPushInterfaceEXTRA_MSG_IDSDK 161 以上版本支持。唯一标识消息的 ID, 可用于上报统计等。Bundle bundle = intentgetExtras();String file = bundlegetString(JPushInterfaceEXTRA_MSG_ID);Action - cnjpushandroidintentNOTIFICATION_RECEIVED收到了通知 Push。如果通知的内容为空,则在通知栏上不会展示通知。但是,这个广播 Intent 还是会有。开发者可以取到通知内容外的其他信息。Intent 参数JPushInterfaceEXTRA_NOTIFICATION_TITLE保存服务器推送下来的通知的标题。对应 API 通知内容的 n_title 字段。对应 Portal 推送通知界面上的“通知标题”字段。Bundle bundle = intentgetExtras();String title = bundlegetString(JPushInterfaceEXTRA_NOTIFICATION_TITLE);JPushInterfaceEXTRA_ALERT保存服务器推送下来的通知内容。对应 API 通知内容的 n_content 字段。对应 Portal 推送通知界面上的“通知内容”字段。Bundle bundle = intentgetExtras();String content = bundlegetString(JPushInterfaceEXTRA_ALERT);JPushInterfaceEXTRA_EXTRASDK 129 以上版本支持。保存服务器推送下来的附加字段。这是个 JSON 字符串。对应 API 通知内容的 n_extras 字段。对应 Portal 推送通知界面上的“自定义内容”字段。Bundle bundle = intentgetExtras();String extras = bundlegetString(JPushInterfaceEXTRA_EXTRA);JPushInterfaceEXTRA_NOTIFICATION_IDSDK 135 以上版本支持。通知栏的Notification ID,可以用于清除NotificationBundle bundle = intentgetExtras();int notificationId = bundlegetInt(JPushInterfaceEXTRA_NOTIFICATION_ID);JPushInterfaceEXTRA_CONTENT_TYPE保存服务器推送下来的内容类型。对应 API 消息内容的 content_type 字段。 Portal 上暂时未提供输入字段。Bundle bundle = intentgetExtras();String type = bundlegetString(JPushInterfaceEXTRA_CONTENT_TYPE);JPushInterfaceEXTRA_RICHPUSH_HTML_PATHSDK 140 以上版本支持。富媒体通知推送下载的HTML的文件路径,用于展现WebView。Bundle bundle = intentgetExtras();String fileHtml = bundlegetString(JPushInterfaceEXTRA_RICHPUSH_HTML_PATH);JPushInterfaceEXTRA_RICHPUSH_HTML_RESSDK 140 以上版本支持。富媒体通知推送下载的资源的文件名,多个文件名用 “,” 分开。 与 “JPushInterfaceEXTRA_RICHPUSH_HTML_PATH” 位于同一个路径。Bundle bundle = intentgetExtras();String fileStr = bundlegetString(JPushInterfaceEXTRA_RICHPUSH_HTML_RES);String[] fileNames = fileStrspilt(",");JPushInterfaceEXTRA_MSG_IDSDK 161 以上版本支持。 唯一标识通知消息的 ID, 可用于上报统计等。Bundle bundle = intentgetExtras();String file = bundlegetString(JPushInterfaceEXTRA_MSG_ID);Action - cnjpushandroidintentNOTIFICATION_OPENED用户点击了通知。一般情况下,用户不需要配置此 receiver action。如果开发者在 AndroidManifestxml 里未配置此 receiver action,那么,SDK 会默认打开应用程序的主 Activity,相当于用户点击桌面图标的效果。如果开发者在 AndroidManifestxml 里配置了此 receiver action,那么,当用户点击通知时,SDK 不会做动作。开发者应该在自己写的 BroadcastReceiver 类里处理,比如打开某 Activity 。Intent 参数JPushInterfaceEXTRA_NOTIFICATION_TITLE保存服务器推送下来的通知的标题。对应 API 通知内容的 n_title 字段。对应 Portal 推送通知界面上的“通知标题”字段。Bundle bundle = intentgetExtras();String title = bundlegetString(JPushInterfaceEXTRA_NOTIFICATION_TITLE);JPushInterfaceEXTRA_ALERT保存服务器推送下来的通知内容。对应 API 通知内容的n_content字段。对应 Portal 推送通知界面上的“通知内容”字段。Bundle bundle = intentgetExtras();String content = bundlegetString(JPushInterfaceEXTRA_ALERT);JPushInterfaceEXTRA_EXTRASDK 129 以上版本支持。保存服务器推送下来的附加字段。这是个 JSON 字符串。对应 API 消息内容的 n_extras 字段。对应 Portal 推送通知界面上的“自定义内容”字段。Bundle bundle = intentgetExtras();String type = bundlegetString(JPushInterfaceEXTRA_EXTRA);JPushInterfaceEXTRA_NOTIFICATION_IDSDK 135 以上版本支持。通知栏的Notification ID,可以用于清除NotificationBundle bundle = intentgetExtras();int notificationId = bundlegetInt(JPushInterfaceEXTRA_NOTIFICATION_IDJPushInterfaceEXTRA_MSG_IDSDK 161 以上版本支持。唯一标识调整消息的 ID, 可用于上报统计等。Bundle bundle = intentgetExtras();String file = bundlegetString(JPushInterfaceEXTRA_MSG_ID);代码示例public void onReceive(Context context, Intent intent) { Bundle bundle = intentgetExtras(); Logd(TAG, "onReceive - " + intentgetAction()); if (JPushInterfaceACTION_REGISTRATION_IDequals(intentgetAction())) { } else if (JPushInterfaceACTION_MESSAGE_RECEIVEDequals(intentgetAction())) { Systemoutprintln("收到了自定义消息。消息内容是:" + bundlegetString(JPushInterfaceEXTRA_MESSAGE)); // 自定义消息不会展示在通知栏,完全要开发者写代码去处理 } else if (JPushInterfaceACTION_NOTIFICATION_RECEIVEDequals(intentgetAction())) { Systemoutprintln("收到了通知"); // 在这里可以做些统计,或者做些其他工作 } else if (JPushInterfaceACTION_NOTIFICATION_OPENEDequals(intentgetAction())) { Systemoutprintln("用户点击打开了通知"); // 在这里可以自己写代码去定义用户点击后的行为 Intent i = new Intent(context, TestActivityclass); //自定义打开的界面 isetFlags(IntentFLAG_ACTIVITY_NEW_TASK); contextstartActivity(i); } else { Logd(TAG, "Unhandled intent - " + intentgetAction()); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)