как мне запустить поток регистрации, который находится в другом фрагменте

#android #notifications #google-cloud-messaging

#Android #уведомления #google-облако-обмен сообщениями

Вопрос:

У меня есть приложение, в котором есть основное действие и два фрагмента, запущенных поверх него, один из фрагментов связан с регистрацией уведомлений Google Cloud и получением push-уведомлений от gcm. Теперь проблема заключается в том, что пользователь впервые запускает приложение и нажимает на фрагмент уведомления, после чего запускается только процесс регистрации в gcm, а затем он начинает получать уведомления. Но я хочу автоматически запустить процесс регистрации из основного acitvity без необходимости переключения на фрагмент уведомления. Как мне этого добиться? Я попытался создать новую функцию во фрагменте уведомления и поместить весь код, касающийся регистрации gcm, в эту функцию, а затем я попытался вызвать эту функцию из MainActivity, но она получает исключение нулевого указателя.. Пожалуйста, взгляните на мой код

 public class NotificationFragment extends Fragment {
    TextView lblMessage;
    private AppPreferences _appPrefs;
    public AsyncTask<Void, Void, Void> mRegisterTask;
    AlertDialogManager alert = new AlertDialogManager();
    ConnectionDetector cd;
    public static String name;
    public static String email;
    public View rootView;
    public NotificationFragment(){}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        rootView = inflater.inflate(R.layout.gcm_activity_main, container, false);

        return rootView;
    }       

    @Override
    public void onStart (){
        super.onStart();
        autoRegistrationForNotification();
    }

    public void autoRegistrationForNotification()
    {
           _appPrefs = new AppPreferences(rootView.getContext());
            _appPrefs.setToZero();

            cd = new ConnectionDetector(getActivity().getApplicationContext());

            name = " ";
            email = " ";
            // Make sure the device has the proper dependencies.
            //if(cd.isConnectingToInternet())
            try{
                GCMRegistrar.checkDevice(getActivity().getApplicationContext());
            }catch(Exception e){}
            // Make sure the manifest was properly set - comment out this line
            // while developing the app, then uncomment it when it's ready.
            //if(cd.isConnectingToInternet())
                try{
                GCMRegistrar.checkManifest(getActivity().getApplicationContext());
                }catch(Exception e){}
            lblMessage = (TextView) rootView.findViewById(R.id.lblMessage);
            lblMessage.setText(_appPrefs.getMessageFromArchive());
            getActivity().getApplicationContext().registerReceiver(mHandleMessageReceiver, new IntentFilter(
                    DISPLAY_MESSAGE_ACTION));
            // Get GCM registration id
            //if(cd.isConnectingToInternet()){
            final String regId = GCMRegistrar.getRegistrationId(getActivity().getApplicationContext());

            // Check if regid already presents
            if (regId.equals("")) {
                // Registration is not present, register now with GCM
            //  if(cd.isConnectingToInternet())
                try{
                GCMRegistrar.register(getActivity().getApplicationContext(), SENDER_ID);}
                catch(Exception e){}
            } else {
                // Device is already registered on GCM
                //if(cd.isConnectingToInternet())
                if (GCMRegistrar.isRegisteredOnServer(getActivity().getApplicationContext())) {
                    // Skips registration.              
                //  Toast.makeText(getActivity().getApplicationContext(), "Already registered with GCM", Toast.LENGTH_LONG).show();
                } else {
                    // Try to register again, but not in the UI thread.
                    // It's also necessary to cancel the thread onDestroy(),
                    // hence the use of AsyncTask instead of a raw thread.
                    final Context context = getActivity().getApplicationContext();
                    mRegisterTask = new AsyncTask<Void, Void, Void>() {

                        @Override
                        protected Void doInBackground(Void... params) {
                            // Register on our server
                            // On server creates a new user
                        //  if(cd.isConnectingToInternet())

                            try{
                                ServerUtilities.register(context, name, email, regId);}
                            catch(Exception e){}
                            return null;
                        }

                        @Override
                        protected void onPostExecute(Void result) {
                            mRegisterTask = null;
                        }

                    };

                    try{
                //  if(cd.isConnectingToInternet())
                        try{
                        mRegisterTask.execute(null, null, null);}catch(Exception e){}
                    }catch(Exception e){}   
                }
            }//else ends


    }

    /**
     * Receiving push messages
     * */
    public final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
          //  _appPrefs = new AppPreferences(getActivity());
            _appPrefs = new AppPreferences(rootView.getContext());

            String newMessage = "";
            try{
                _appPrefs.incrementNotificationCount();


            newMessage = intent.getExtras().getString(EXTRA_MESSAGE);
            // Waking up mobile if it is sleeping
            }catch(Exception e)
            {

            }
            try{
            WakeLocker.acquire(getActivity().getApplicationContext());
            }catch(Exception e)
            {

            }

            if(_appPrefs.getMessageFromArchive().length() > 800){
                _appPrefs.saveMessageToArchive(" ");
            }

             Time now = new Time();
                now.setToNow();
                int month = now.month;
                int day = now.monthDay;
                int year = now.year;
                DateFormatSymbols dfs = new DateFormatSymbols();
                String[] months = dfs.getMonths();

            //lblMessage.append("n" String.valueOf(day) " "  months[month - 1]   " " String.valueOf(year) "n" newMessage.toString());

                try{
                    if(newMessage!=null)
                    {   
                        _appPrefs.saveMessageToArchive(_appPrefs.getMessageFromArchive().toString() "n   _____________________    n" String.valueOf(day) " "  months[month - 1]   " " String.valueOf(year) "n" newMessage.toString());

                        lblMessage.setText(_appPrefs.getMessageFromArchive());
                    }else{}

                    }
                catch(Exception e){}
            Toast.makeText(getActivity().getApplicationContext(), "New Message: "   newMessage, Toast.LENGTH_LONG).show();
        try{    
            // Releasing wake lock
            WakeLocker.release();}catch(Exception e){}
        }
    };
}
  

Ответ №1:

But I want to automatically start the registration process from the main acitvity without the wating for switching to notification fragment

Если вы хотите зарегистрироваться в GCM из основного действия, еще до создания фрагмента, вам следует переместить регистрационный код в onCreate метод действия.