废话不多说,直接上代码:
1、现在配置文件AndroidManifest中的<manifest><manifest/>标签的最开始复制这些
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"/>
<!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 用于读取手机当前的状态 -->
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 访问网络,网络定位需要上网 -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.READ_LOGS"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<permission
android:name="com.health.huainan.healthhandbook.permission.JPUSH_MESSAGE"
android:protectionLevel="signature"/>
<uses-permission android:name="com.health.huainan.healthhandbook.permission.JPUSH_MESSAGE"/>
<uses-permission android:name="android.permission.VIBRATE"/>
上面这些都是假权限的,,加载哪里小伙伴们应该都知道吧?也给大家截个图:
2、紧接着上面写完后,下面就是<application><application/>这个标签了,下面的要放在application标签中,先看图,需要一个初始化的类,做android的,这个都懂吧?
3、按照上面的在上面标签里面把初始化的类加上,然后集成详细的极光配置文件一定写在application标签里面,(我曾经把极光的这部分最重要的配置放在了标签外面,运行时一直收不到消息,找了好久发现这个问题)
详细配置如下:
<!-- 集成极光 -->
<!-- Required SDK核心功能 直接拷贝 -->
<activity
android:name="cn.jpush.android.ui.PushActivity"
android:configChanges="orientation|keyboardHidden"
android:exported="false">
<intent-filter>
<action android:name="cn.jpush.android.ui.PushActivity"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="com.health.huainan.healthhandbook"/>
</intent-filter>
</activity>
<!-- Required SDK核心功能 直接拷贝 -->
<service
android:name="cn.jpush.android.service.DownloadService"
android:enabled="true"
android:exported="false"/>
<!-- Required SDK 核心功能 直接拷贝 -->
<service
android:name="cn.jpush.android.service.PushService"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="cn.jpush.android.intent.REGISTER"/>
<action android:name="cn.jpush.android.intent.REPORT"/>
<action android:name="cn.jpush.android.intent.PushService"/>
<action android:name="cn.jpush.android.intent.PUSH_TIME"/>
</intent-filter>
</service>
<!-- 可不拷贝 since 1.8.0 option 可选项。用于同一设备中不同应用的JPush服务相互拉起的功能。 -->
<!-- 若不启用该功能可删除该组件,将不拉起其他应用也不能被其他应用拉起 -->
<service
android:name="cn.jpush.android.service.DaemonService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="cn.jpush.android.intent.DaemonService"/>
<category android:name="com.health.huainan.healthhandbook"/>
</intent-filter>
</service>
<!-- since 3.1.0 Required SDK 核心功能--> <provider android:authorities="com.health.gw.healthhandbook.DownloadProvider" android:name="cn.jpush.android.service.DownloadProvider" android:exported="true" /> <!-- since 3.0.9 Required SDK 核心功能--> <provider android:authorities="com.health.gw.healthhandbook.DataProvider" android:name="cn.jpush.android.service.DataProvider" android:exported="false" />
<!-- Required SDK核心功能 直接拷贝 -->
<receiver
android:name="cn.jpush.android.service.PushReceiver"
android:enabled="true"
android:exported="false">
<intent-filter android:priority="1000">
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY"/>
<!-- Required 显示通知栏 -->
<categoryandroid:name="com.health.huainan.healthhandbook"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.USER_PRESENT"/>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
<!-- Optional -->
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED"/>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<data android:scheme="package"/>
</intent-filter>
</receiver>
<!-- Required SDK核心功能 直接拷贝 -->
<receiver android:name="cn.jpush.android.service.AlarmReceiver"/>
<receiver
android:name="com.health.gw.healthhandbook.receiver.MyJpushReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="cn.jpush.android.intent.REGISTRATION"/>
<!-- Required 用户注册SDK的intent -->
<actionandroid:name="cn.jpush.android.intent.UNREGISTRATION"/>
<action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED"/>
<!-- Required 用户接收SDK消息的intent -->
<actionandroid:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED"/>
<!-- Required 用户接收SDK通知栏信息的intent -->
<actionandroid:name="cn.jpush.android.intent.NOTIFICATION_OPENED"/>
<!-- Required 用户打开自定义通知栏的intent -->
<actionandroid:name="cn.jpush.android.intent.ACTION_RICHPUSH_CALLBACK"/>
<!-- Optional 用户接受Rich Push Javascript 回调函数的intent -->
<actionandroid:name="cn.jpush.android.intent.CONNECTION"/>
<!-- 接收网络变化 连接/断开 since 1.6.3 -->
<categoryandroid:name="com.health.huainan.healthhandbook"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
<action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
<action android:name="android.net.wifi.STATE_CHANGE"/>
</intent-filter>
</receiver>
<!-- Required . Enable it you can get statistics data with channel 要求填写appKey再拷贝 -->
<meta-data
android:name="JPUSH_CHANNEL"
android:value="developer-default"/>
<meta-data
android:name="JPUSH_APPKEY"
android:value="这里是你的APPkey"/>
<!-- </>值来自开发者平台取得的AppKey -->
4、上面的位置不要放错了,再给大家接一个图,看一下,上面的复制完,下面就是这样啦!应该是application标签的结束位置了!:
4)注意,复制上面时候,注意配置文件中的这部分有一个value值是自己在极光官网注册的软件app 的APPKEY值,而且是唯一的。
5)注意下面,配置文件有几处这位置是写自己的应用包名的,
应用包名在你的build.gradle(Module:app)中查看applicationId:看图明了:
6)上图中说的为什么那么写呢?在这里,想必你在官网已经下载了相关文件了吧?找到这个文件夹,直接赋值到这里,下面标注的这个文件夹里面
应该有好几个文件夹,文件夹里面还有文件,不要动,直接赋值到这里,注意赋值的位置,和资源文件夹(res)同级,看图说话:
注意拷贝复制不要放错位置,直接在app文件下,这个文件夹下是这两个文件
*注意,有的新版的下载下来可能还有几个文件夹,没关系,一起复制进来,大家看到这两个文件夹的名字是不是想起来什么了啊?前面在build.gradle中ndk中的配置
对,就是这两个名字,有其他的文件名,也一起加上也行!
7)
6)还需要导入极光包,这个你下载的应该有吧?放在哪里一会再说,先把这个加上:
上面我的版本是3.0.8的,你的就根据你的版本对应得加上,还有下面的那个,1.1.6的,我也不清楚,因为有这个包,也需要加上:下面我就把
这两个包的位置截图发出来:
看到了吧?不过需要选择project模式才能看到这个lib包下面的这些东西,那两个包就放这里,
7)下面就开始加极光接收部分的代码了
小伙伴们注意喽:上面弄了半天,没有下面这个也白费,极光广播接收器的代码:需要自己创建一个接受类:一般都这么起名,不用改,
创建一个包名:receiver 新建一个类叫:MyJpushReceiver 下面是类里面的代码:
import android.app.AlertDialog; import android.app.NotificationManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.WindowManager; import com.health.gw.healthhandbook.LoginActivity; import com.health.gw.healthhandbook.WebViewActivity; import com.health.gw.healthhandbook.commui.ActivityCollector; import com.health.gw.healthhandbook.commui.FragmentTabAtivity; import org.json.JSONException; import org.json.JSONObject; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import cn.jpush.android.api.JPushInterface; /** * 自定义接收器 * <p> * 如果不定义这个 Receiver,则: * 1) 默认用户会打开主界面 * 2) 接收不到自定义消息 */ public class MyJpushReceiver extends BroadcastReceiver { private static String TAG = "MyJpushReceiver"; private NotificationManager nm; private DateFormat formatter; private Date dadte; @Override public void onReceive(Context context, Intent intent) { if (null == nm){ nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); } formatter = new SimpleDateFormat("HH:mm:ss"); Bundle bundle = intent.getExtras();//获取intent里携带的数据集合 Log.e("极光推送:", "接收成功"); /** * 一个技巧:把已知的动作写在前面,未知的动作写在后面,这样在用equals时可以避免空指针异常 */ if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())){ String registID = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID); Log.i("ID1",""+registID);// } //当用户点击了通知 if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) { Log.e("用户点击了通知,通知的标题为:", bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE)); ////// Intent intent1 = new Intent(context,FragmentTabAtivity.class); intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent1.putExtra("message",1); context.startActivity(intent1); String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);//获取附加字段,是一个json数组 try { JSONObject json = new JSONObject(extras); Log.i("jsonObject","---->"+json); //进行json.getString("Article")操作时,要保证这里的Article与服务器上的Article一模一样,不然会报空指针异常 String articleUrl = json.getString("MsgURL");//获取附加字段Article,对应的值为articleUrl Log.e("MsgURL:", articleUrl); /** * 点击通知栏通知, 打开网页地址 * 把articleUrl通过startActivity发送给WebViewActivity */ // Intent intent_WebView = new Intent(Util.OPEN_ADD_FRIEND_PAGE); Intent intent_WebView = new Intent(context,WebViewActivity.class); //必须要写,不然出错,因为这是一个从非activity的类跳转到一个activity,需要一个flag来说明,这个flag就是Intent.FLAG_ACTIVITY_NEW_TASK intent_WebView.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent_WebView.putExtra("articleUrl",articleUrl); // Bundle bundle_WebView = new Bundle(); // bundle_WebView.putString("articleUrl", articleUrl);//文章url // intent_WebView.putExtras(bundle_WebView); intent_WebView.setAction("notification_webview"); intent_WebView.addCategory("notification_webview"); context.startActivity(intent_WebView);//打开WebViewActivity // context.sendBroadcast(intent_WebView); } catch (JSONException e) { e.printStackTrace(); } }else if(JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())){ /////// Log.e("用户收到了消息,消息的ID为:", bundle.getString(JPushInterface.EXTRA_MSG_ID)); // Intent intent1 = new Intent(Util.SEND_MESSAGE_BROAD); // intent1.putExtra("bundle",bundle); // context.sendBroadcast(intent1); //自定义消息显示弹出框 alertDialog(context); // LocalBroadcastManager.getInstance(context).sendBroadcast(intent1); } //当用户收到了通知(用户只有先收到通知,才能点击通知) else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) { //////// Log.e("用户收到了通知,通知的标题为:", bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE)); String title = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE);//获取通知标题 Log.e("title:", title); String text = bundle.getString(JPushInterface.EXTRA_ALERT);//获取通知内容 Log.e("text:", text); String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);//获取附加字段,是一个json数组 // JSONObject json = null; // try { // json = new JSONObject(extras); //String imageUrl = json.getString("Image");//获取附加字段Image,对应的值为imageUrl // Log.e("imageUrl:", imageUrl); // String articleUrl = json.getString("MsgURL");//获取附加字段Article,对应的值为articleUrl // Log.e("MsgURL:", articleUrl); // Intent intent1 = new Intent(context, WebViewActivity.class); // intent1.putExtra("MsgURL",articleUrl); // } catch (JSONException e) { // e.printStackTrace(); // } //把articleUrl, imageUrl, text, title的数据存到数据库里 // SQLOpenHelper helper = new SQLOpenHelper(context); // helper.add(articleUrl, imageUrl, text, title); Log.e("已经执行到log", "1"); } } private void alertDialog(final Context context) { Log.i("弹出框",":-------》"); AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("下线通知"); builder.setMessage("您的账号于"+formatter.format(new Date())+"在其它手机上登陆,为了您的信息安全,请及时查看"); builder.setCancelable(false); builder.setPositiveButton("重新登陆", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); // builder.setNegativeButton("退出",new DialogInterface.OnClickListener(){ // // @Override // public void onClick(DialogInterface dialog, int which) { // //清楚所有活动界面 // ActivityCollector.finishAll(); // } // }); AlertDialog dialog = builder.create(); dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); dialog.show(); } }
这里面的代码可能并不全是你能需要的,自己看不需要的可以删除
这里面有我自己写的在获取消息时,点击消息跳转的界面,还有自定义消息(我们使用自定义消息来进行一等登录下线功能)获取时,可以在任意界面弹出下面通知,点击确定后可以跳回到登录界面等等!
8)下面就把最开始的那个初始化类Application类加上:看图:
上面这些应该差不多就可以了!
下面就可以在登录你注册的极光账号进行测试吧!如何测试我就不说了,,这么简单,,,哈哈哈哈。。。今天就到这了~~~~~回见。。。。