Android,是否可以在不使用Google Cloud Messaging系统的情况下向设备广播消息?

时间:2013-01-11 03:45:34

标签: android google-cloud-messaging

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

我有一个新闻&杂志应用程序,我想向特定设备广播消息。例如,有些用户希望获得Sports的新更新,而其他用户可能有其他类别的新更新。

我正在寻找一种模拟GCM系统的方法。可能吗?

由于

2 个答案:

答案 0 :(得分:2)

是的,有可能。

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

以下是我使用的一些代码。

首先,我在BroadcastReceiver

中创建ServiceAndroidManifest.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外,还有许多不同的选择。

需要进行黑客攻击的选项:

MQTT - blog 1blog 2

aSmack使用XMPP

The Deacon Project

第三方开箱即用的提供商:

Parse

Urban Airship

Push.io

另见:

Does Android support near real time push notification?

Push Notifications in Android Platform