2015-05-20 2 views
1

У меня есть простая деятельность, которая создает службу переднего плана. Я хотел бы передать значение из EditText в Service как количество, на которое экран должен быть затемнен. MainActivity выглядит следующим образом:Передающая ценность EditText для обслуживания

package com.mycompany.myapp; 

import android.app.*; 
import android.content.*; 
import android.net.*; 
import android.net.wifi.*; 
import android.os.*; 
import android.view.*; 
import android.view.View.*; 
import android.widget.*; 
import android.provider.*; 
import android.text.*; 


public class MainActivity extends Activity 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     final EditText edDim = (EditText) findViewById(R.id.DimVal); 
     edDim.setInputType(InputType.TYPE_CLASS_NUMBER); 

     Button btnStart =(Button) findViewById(R.id.button1); 
     btnStart.setOnClickListener(new View.OnClickListener(){ 

      @Override 
      public void onClick(View v){ 
       Intent intent = new Intent(getBaseContext(), MyService.class); 
       intent.putExtra("DimVal",edDim.getText()); 
       startService(intent); 
      } 
     }); 

     Button btnStop =(Button) findViewById(R.id.button2); 
     btnStop.setOnClickListener(new View.OnClickListener(){ 

       @Override 
       public void onClick(View v){ 
        stopService(new Intent(getBaseContext(), MyService.class)); 
       } 
      }); 

    } 
} 

Это услуга:

package com.mycompany.myapp; 
import android.app.*; 
import android.content.*; 
import android.net.*; 
import android.os.*; 
import android.provider.*; 
import android.view.*; 
import android.widget.*; 

public class MyService extends Service 
{ 
public int timeVal; 
    @Override 
    public IBinder onBind(Intent p1) 
    { 
     // TODO: Implement this method 
     return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     // TODO: Implement this method 
     Toast.makeText(this,"Usługa uruchomiona",Toast.LENGTH_LONG).show(); 
     timeVal = intent.getIntExtra("DimVal",100); 
     this.registerReceiver(this.mComnReceiver, 
           new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); 
     Notification note = new Notification(0, null, 
     System.currentTimeMillis());note.flags = Notification.FLAG_NO_CLEAR; 
     this.startForeground(1,note); 
     return START_STICKY; 
    } 

    /*@Override 
    public void onDestroy() 
    { 
     // TODO: Implement this method 
     super.onDestroy(); 
     Toast.makeText(this,"Usługa zatrzymana",Toast.LENGTH_LONG).show(); 
    }*/ 

    private BroadcastReceiver mComnReceiver = new BroadcastReceiver(){ 

     @Override 
     public void onReceive(Context p1, Intent p2) 
     { 
      ConnectivityManager manager = (ConnectivityManager) 
       getSystemService(CONNECTIVITY_SERVICE); 
      boolean isWiFi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting(); 


      //NetworkInfo currentNetworkInfo = (NetworkInfo) 
       //p2.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); 

      if(isWiFi){ 
       Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, timeVal); 

      }else{ 

       Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, 300); 

      } 

     } 


    }; 
} 

Но приведенный выше код не работает. Также, как я могу проверить сервис, если WiFi работает каждые 5 минут? Я понимаю, что этот код не может быть лучшим решением проблемы, но это первая программа для Android, которую я написал (таким образом, прокомментированный код). Спасибо заранее.

+0

Что означает «не работает»? Можете ли вы отправить свою ошибку LogCat, пожалуйста? –

+0

Вы отлаживаете свой код –

+0

Почему бы вам не создать статический объект String, а затем поместить в него значение «EditText», а затем вызвать эту статическую строку в свой класс обслуживания? –

ответ

0

Я вижу вопрос в этой строке кода

intent.putExtra("DimVal",edDim.getText()); 

Здесь вы должны сделать, как

intent.putExtra("DimVal",Integer.valueOf(edDim.getText().toString)); 

EditText getText т.е. edDim.getText() даст вам Editable не значение внутри. Также, как вы это сделаете, edDim.getText().toString предоставит вам значение String, которое вам необходимо изменить для Integer перед передачей.

Примечание: вам необходимо поставить null и проверить проверку для edDim перед передачей значения в намерении; иначе это может дать вам runtimeerror.

Что касается проверки Wi-Fi, было бы неплохо создать широковещательный приемник, который получает обновления для проверки соединения, и в этом случае, если есть возможность подключения, вы можете проверить, является ли это Wifi или Mobile data и возвращать false, если мобильные данные. Таким образом, вы не должны проверять каждые пять минут, что может привести к дренажу батареи.

Вы можете проверить этот пост для разработчиков Android для Determining and Monitoring the Connectivity Status.

+0

спасибо, что решил. Что касается приемника Broacast, он объявлен в Myservice.java, если я получил то, что вы написали правильно. – BroPl

1
 public void timerForWifiCheck(long intervalVal, long countVal) { 

        new SCBP_TimerClass(intervalVal, countVal) { 
         @Override 
         public void onTick(long tickTime) { 

          //Wifi checking code write here 
         if(SCBP_NetworkUtil.checkInternetConnection(Context)){ 
         //Do what you wnat e.g 
         finish() 
        }else{ 
         //Return with some error code or msg 
        } 

          } 
         } 
         @Override 
         public void onFinish() { 
          //code when the timer finshes 
         } 
        }.start(); 
       } 






    For this You need to add the below two classes: 


     public abstract class TimerClass { 

     /** 
     * Millis since epoch when alarm should stop. 
     */ 
     private final long mMillisInFuture; 

     /** 
     * The interval in millis that the user receives callbacks 
     */ 
     private final long mCountdownInterval; 

     private long mStopTimeInFuture; 

     private long mPauseTime; 

     private boolean mCancelled = false; 

     private boolean mPaused = false; 

     /** 
     * @param millisInFuture 
     *   The number of millis in the future from the call to 
     *   {@link #start()} until the countdown is done and 
     *   {@link #onFinish()} is called. 
     * @param countDownInterval 
     *   The interval along the way to receive {@link #onTick(long)} 
     *   callbacks. 
     */ 
     public SCBP_TimerClass(long millisInFuture, long countDownInterval) { 
      mMillisInFuture = millisInFuture; 
      mCountdownInterval = countDownInterval; 
     } 

     /** 
     * Cancel the countdown. 
     * 
     * Do not call it from inside CountDownTimer threads 
     */ 
     public final void cancel() { 
      mHandler.removeMessages(MSG); 
      mCancelled = true; 
     } 

     /** 
     * Start the countdown. 
     */ 
     public synchronized final SCBP_TimerClass start() { 
      if (mMillisInFuture <= 0) { 
       onFinish(); 
       return this; 
      } 
      mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture; 
      mHandler.sendMessage(mHandler.obtainMessage(MSG)); 
      mCancelled = false; 
      mPaused = false; 
      return this; 
     } 

     /** 
     * Pause the countdown. 
     */ 
     public long pause() { 
      mPauseTime = mStopTimeInFuture - SystemClock.elapsedRealtime(); 
      mPaused = true; 
      return mPauseTime; 
     } 

     /** 
     * Resume the countdown. 
     */ 
     public long resume() { 
      mStopTimeInFuture = mPauseTime + SystemClock.elapsedRealtime(); 
      mPaused = false; 
      mHandler.sendMessage(mHandler.obtainMessage(MSG)); 
      return mPauseTime; 
     } 

     /** 
     * Callback fired on regular interval. 
     * 
     * @param millisUntilFinished 
     *   The amount of time until finished. 
     */ 
     public abstract void onTick(long millisUntilFinished); 

     /** 
     * Callback fired when the time is up. 
     */ 
     public abstract void onFinish(); 

     private static final int MSG = 1; 

     // handles counting down 
     private Handler mHandler = new Handler() { 

      @Override 
      public void handleMessage(Message msg) { 

       synchronized (SCBP_TimerClass.this) { 
        if (!mPaused) { 
         final long millisLeft = mStopTimeInFuture 
           - SystemClock.elapsedRealtime(); 

         if (millisLeft <= 0) { 
          onFinish(); 
         } else if (millisLeft < mCountdownInterval) { 
          // no tick, just delay until done 
          sendMessageDelayed(obtainMessage(MSG), millisLeft); 
         } else { 
          long lastTickStart = SystemClock.elapsedRealtime(); 
          onTick(millisLeft); 

          // take into account user's onTick taking time to 
          // execute 
          long delay = lastTickStart + mCountdownInterval 
            - SystemClock.elapsedRealtime(); 

          // special case: user's onTick took more than 
          // interval to 
          // complete, skip to next interval 
          while (delay < 0) 
           delay += mCountdownInterval; 

          if (!mCancelled) { 
           sendMessageDelayed(obtainMessage(MSG), delay); 
          } 
         } 
        } 
       } 
      } 
     }; 
     } 

public class NetworkUtil { 
    public static boolean checkInternetConnection(Context context) { 

     ConnectivityManager con_manager = (ConnectivityManager) context 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 
     if (con_manager.getActiveNetworkInfo() != null 
       && con_manager.getActiveNetworkInfo().isAvailable() 
       && con_manager.getActiveNetworkInfo().isConnected()) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 


    Hope this will help you to some extent.Cheers! 
+0

Попробуй тоже один. Спасибо. – BroPl

+0

Если вы просто хотите узнать, нет ли там сетевого подключения, напишите мне, что линия также поможет вам в этом – Haroon

+0

BroPl просто проверьте выше и посмотрите, может ли он соответствовать вашим требованиям .. Я редактировал защитное решение с кодом проверки сети внутри метода timerForWifiCheck, и добавили еще один класс – Haroon

Смежные вопросы