您可能知道,某些国家/地区的某些国家/地区拒绝访问www.android.com及其所有子域(如developer.android.com)等Google服务器。因此,无法使用GCM。
我有一个新闻&杂志应用程序,我想向特定设备广播消息。例如,有些用户希望获得Sports的新更新,而其他用户可能有其他类别的新更新。
我正在寻找一种模拟GCM系统的方法。可能吗?
由于
答案 0 :(得分:2)
是的,有可能。
Message API
(您可以使用任何格式的JSON或XML)Android Service
将连接到该Message API并进行检查
新消息BroadcastReceiver
以下是我使用的一些代码。
首先,我在BroadcastReceiver
Service
和AndroidManifest.xml
<receiver android:name="com.example.Push_Notification" >
<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.NETWORK_IDS_CHANGED" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service
android:name="com.example.Push_Notification_Checker"
android:enabled="true" />
这是Push_Notification
:
public class Push_Notification extends BroadcastReceiver{
private Context context;
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
this.context = context;
startService();
}
public void startService(){
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE );
NetworkInfo activeNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE|ConnectivityManager.TYPE_WIFI);
boolean isConnected = activeNetInfo != null && activeNetInfo.isConnectedOrConnecting();
Calendar cur_cal = Calendar.getInstance();
cur_cal.setTimeInMillis(System.currentTimeMillis());
Intent i = new Intent(context, Push_Notification_Checker.class);
PendingIntent pintent = PendingIntent.getService(context, 0, i, 0);
AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if (isConnected){
catchLog("connecte " +isConnected);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cur_cal.getTimeInMillis(), 1 * 60*1000, pintent);
}
else {
catchLog("not connecte " +isConnected);
alarm.cancel(pintent);
}
}
private void catchLog(String log) {
Log.i("PushNotification", log);
}
}
这是Push_Notification_Checker
服务。 :
public class Push_Notification_Checker extends Service {
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
catchLog("Service got created");
nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
pref = getSharedPreferences(Constants.SHARED_PRED, 0);
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
//Here i call AsyncTask to check Message. Android didn't allow Network Connection directly tied into Main Thread
new GetMessage(getApplicationContext()).execute();
}
}
通过向服务器发送android UDID,您可以检查特定设备是否有新消息。这样您就可以向特定设备发送消息。 How to getUDID ?
Here是我使用AsyncTask进行连接的原因,这两个例子可以帮助您了解如何与服务器进行通信。
how to send data to server using android by Http post method?
Send data from android to server via JSON
我知道这是一个很长的镜头,但希望这可以在某种程度上帮助你。
P.S:我也来自谷歌拒绝的国家之一答案 1 :(得分:1)
除GCM外,还有许多不同的选择。
需要进行黑客攻击的选项:
aSmack使用XMPP
第三方开箱即用的提供商:
另见: