1

您可能知道访问 Google 服务器(例如www.android.com)及其所有子域(例如developer.android.com)在某些国家/地区被 Google 拒绝。因此,无法使用 GCM。

我有一个 NEWS & Magazine 应用程序,我想向特定设备广播消息。例如,一些用户希望有新的体育更新,而另一些用户可能有其他类别的新更新。

我正在寻找一种模拟 GCM 系统的方法。是否可以?

谢谢

4

2 回答 2

2

是的,有可能。

  • Message API(您可以使用任何格式的 JSON 或 XML)
  • Android Service它将连接到该消息 API 并检查新消息
  • 你可能还需要BroadcastReceiver

这是我使用的一些代码。

首先我创建BroadcastReceiverServiceAndroidManifest.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,您可以检查特定设备是否有新消息。这样您就可以将消息发送到特定设备。如何获取UDID?

就是我使用 AsyncTask 进行连接的原因,这两个示例可以帮助您了解如何与服务器进行通信。

如何通过Http post方法使用android向服务器发送数据?

通过 JSON 将数据从 android 发送到服务器

我知道这是一个很长的镜头,但希望这可以在某种程度上帮助你。

PS:我也是来自被谷歌拒绝的国家之一

于 2013-01-11T04:26:30.210 回答
1

除了 GCM 之外,还有许多不同的选项。

需要一些黑客攻击的选项:

MQTT -博客 1博客 2

aSmack使用 XMPP

执事项目

第三方开箱即用提供商:

解析

城市飞艇

Push.io

另见:

Android 是否支持近乎实时的推送通知?

Android 平台中的推送通知

于 2013-01-11T04:33:30.603 回答