2013-01-11 55 views
1

正如你可能知道的訪問谷歌服務器,如www.android.com及其所有子域的樣developer.android.com在一些國家通過谷歌否認。因此,不可能使用GCM。Android,是否可以在不使用Google雲消息系統的情況下向設備廣播消息?

我有一個新聞&雜誌應用程序,我想廣播消息到特定設備。例如,某些用戶想要對體育進行新的更新,而另一些用戶可能會對其他類別進行新的更新。

我正在尋找一種方法來模擬GCM系統。可能嗎?

謝謝

+0

這可能嗎?爲什麼不呢:Google做到了。請注意,添加其他服務會使用更多電池。 –

回答

2

是的,這是可能的。

  • Message API(你可以使用任何格式JSON或XML)
  • Android Service將連接到該消息API和檢查 新的消息
  • ,你可能還需要BroadcastReceiver

這裏是我使用的一些代碼。

首先我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創建BroadcastReceiverService

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:我也是從國家的由谷歌

否認一個