Android - dlaczego co jakiś czas service sie zatrzymuje?

0

Witam.
Mam taki oto kod:

package pl.danek.gielda;

import java.util.ArrayList;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends Activity {

	public static final String ACTION_NEW_MSG = "1";
	public static final String MSG_FIELD_RED = "message";
	public static final String MSG_FIELD_BLUE = "message1";
	public static final String MSG_FIELD_GREEN = "message2";
	public static final String MSG_FIELD_RED_M = "message4";
	public static final String MSG_FIELD_BLUE_M = "message5";
	public static final String MSG_FIELD_GREEN_M = "message6";
	public static final String MSG_FIELD_PROGRESS = "progress";
	public static final String MSG_FIELD_MONEY = "money";

	private TextView red,blue,green,money,myRed,myBlue,myGreen;
	private Button blueP,blueM,greenP,greenM,redP,redM;
	private ProgressBar update;
	private MyReceiver myReceiver;
	private MyService myService;
	private OnClickListener listener;
	private ServiceConnection serviceConnection = new ServiceConnection() {
		
		@Override
		public void onServiceDisconnected(ComponentName name) {
			myService = null;
		}
		
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			MyService.MyBinder binder = (MyService.MyBinder)service;
			myService = binder.getMyService();
		}
	};
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initReceiver();
		initText();
		initButton();
		initService();
	}
	
	
	@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

	@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.newGame:
        	finishService();
        	initService();
        	break;
        default:
        }
 
        return true;
    }


	private void initText(){
		red=(TextView)findViewById(R.id.red);
		blue=(TextView)findViewById(R.id.Blue);
		green=(TextView)findViewById(R.id.green);
		money=(TextView)findViewById(R.id.money);
		myRed=(TextView)findViewById(R.id.redMine);
		myBlue=(TextView)findViewById(R.id.blueMine);
		myGreen=(TextView)findViewById(R.id.greenMine);
		update = (ProgressBar)findViewById(R.id.toNextUpdate);
		update.setMax(30);
	}
	private void initButton(){
		listener = new OnClickListener() {
			@Override
			public void onClick(View v) {
				myService.buttonClicked(v);
			}
		};
		blueP=(Button)findViewById(R.id.blueP);
		blueP.setOnClickListener(listener);
		blueM=(Button)findViewById(R.id.blueM);
		blueM.setOnClickListener(listener);
		greenP=(Button)findViewById(R.id.greenP);
		greenP.setOnClickListener(listener);
		greenM=(Button)findViewById(R.id.greenM);
		greenM.setOnClickListener(listener);
		redP=(Button)findViewById(R.id.redM);
		redP.setOnClickListener(listener);
		redM=(Button)findViewById(R.id.redP);
		redM.setOnClickListener(listener);
	}
	
	public void setMyProgress(int p){
		update.setProgress(p);
	}
	
	private void initService() {
		Intent intent = new Intent(this, MyService.class);
		bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
		startService(intent);
		
	}

	private void finishService() {
		Intent intent = new Intent(this, MyService.class);
		unbindService(serviceConnection);
		stopService(intent);
		
	}

	@Override
	protected void onDestroy(){
		super.onDestroy();
		finishReceiver();
//		finishService();
	}
	private void finishReceiver() {
		unregisterReceiver(myReceiver);
	}
	
	
	private void initReceiver() {
		myReceiver = new MyReceiver();
		IntentFilter filter = new IntentFilter(ACTION_NEW_MSG);
		registerReceiver(myReceiver, filter);
	}
	
	
	
	public class MyReceiver extends BroadcastReceiver {
		@Override
		public void onReceive(Context context, Intent intent) {
			if (intent.getAction().equals(ACTION_NEW_MSG)) {
				String g = intent.getStringExtra(MSG_FIELD_GREEN);
				String b = intent.getStringExtra(MSG_FIELD_BLUE);
				String r = intent.getStringExtra(MSG_FIELD_RED);
				String mg = intent.getStringExtra(MSG_FIELD_GREEN_M);
				String mb = intent.getStringExtra(MSG_FIELD_BLUE_M);
				String mr = intent.getStringExtra(MSG_FIELD_RED_M);
				String m = intent.getStringExtra(MSG_FIELD_MONEY);
				red.setText(r);
				blue.setText(b);
				green.setText(g);
				myRed.setText(mr);
				myBlue.setText(mb);
				myGreen.setText(mg);
				money.setText(m);
				update.setProgress(Integer.parseInt(intent.getStringExtra(MSG_FIELD_PROGRESS)));
			}
		}
	}
}
package pl.danek.gielda;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MyService extends Service{

	private int update;
	Context context = this;
	Timer timer;
	private Game game;
	private final IBinder iBinder = new MyBinder();
	public class MyBinder extends Binder {
	    MyService getMyService() {
	        return MyService.this;
	    }
	}

	@Override
	public IBinder onBind(Intent intent) {
		return iBinder;
	}
	@Override
	public void onCreate() {
		super.onCreate();
		game = new Game();
		sevice();

	}
	@Override
	public void onDestroy() {
		timer.cancel();
		super.onDestroy();
	}
	private void sevice(){
		update=0;
		timer = new Timer();
		TimerTask timerTask = new TimerTask(){
			public void run() {
				update++;
				Intent intent = new Intent(MainActivity.ACTION_NEW_MSG);
				intent.putExtra(MainActivity.MSG_FIELD_RED, game.getRed() +"");
				intent.putExtra(MainActivity.MSG_FIELD_BLUE, game.getBlue() +"");
				intent.putExtra(MainActivity.MSG_FIELD_GREEN, game.getGreen() +"");
				intent.putExtra(MainActivity.MSG_FIELD_RED_M, game.getMyRed() +"");
				intent.putExtra(MainActivity.MSG_FIELD_BLUE_M, game.getMyBlue() +"");
				intent.putExtra(MainActivity.MSG_FIELD_GREEN_M, game.getMyGreen() +"");
				intent.putExtra(MainActivity.MSG_FIELD_PROGRESS, update+"");
				intent.putExtra(MainActivity.MSG_FIELD_MONEY, game.getMoney()+"");
				sendBroadcast(intent);

				if (update>29) {
					game.update();
					update=0;
				}
				
			}}; 
			timer.scheduleAtFixedRate(timerTask , 100, 1000);  
	}


	public void showToast(String text){
		Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();
	}
	
	public void buttonClicked(View v){
		switch (v.getId()) {
		case R.id.blueP:
			if(canBuy(game.getBlue())){
				game.buy('b');
			}
			break;
		case R.id.redP:
			if(canBuy(game.getRed())){
				game.buy('r');
			}
			break;
		case R.id.greenP:
			if(canBuy(game.getGreen())){
				game.buy('g');
			}
			break;
		case R.id.blueM:
			if(canSell(game.getMyBlue())){
				game.sell('b');
			}
			break;
		case R.id.redM:
			if(canSell(game.getMyRed())){
				game.sell('r');
			}
			break;
		case R.id.greenM:
			if(canSell(game.getMyGreen())){
				game.sell('g');
			}
			break;

		default:
			break;
		}
	}
	private boolean canSell(int myShare){
		if(myShare<1){
			showToast("Not enough share");
			return false;
		}else return true;
	}
	private boolean canBuy(int price){
		if(price>game.getMoney()){
			showToast("Not enough money");
			return false;
		}else return true;
	}
}
package pl.danek.gielda;

import java.util.Random;

public class Game {

	private int red,green,blue,money,myRed,myGreen,myBlue;
	private int[] tab = {blue,green,red};
	private Random r;


	public Game(){
		for (int i = 0; i < tab.length; i++) {
			tab[i]=100;
		}
		r= new Random();
		money=100;
	}


	public int getRed(){
		return tab[2];
	}
	public int getGreen(){
		return tab[1];
	}
	public int getBlue(){
		return tab[0];
	}
	public int getMoney(){
		return money;
	}
	public void changeMoney(int x){
		money+=x;
	}
	
	public int getMyRed(){
		return myRed;
	}
	public int getMyBlue(){
		return myBlue;
	}
	public int getMyGreen(){
		return myGreen;
	}
	

	public void update(){

		for (int i=0;i<tab.length;++i){
			tab[i]+=r.nextInt(7)-3;
			if(tab[i]<0)
				tab[i]=0;
			
		}
	}

	public void buy(char i){
		switch (i) {
		case 'b':
			money-=tab[0];
			myBlue++;
			break;
		case 'g':
			money-=tab[1];
			myGreen++;
			break;
		case 'r':
			money-=tab[2];
			myRed++;
			break;

		default:
			break;
		}
	}
	public void sell(char i){
		switch (i) {
		case 'b':
			money+=tab[0];
			myBlue--;
			break;
		case 'g':
			money+=tab[1];
			myGreen--;
			break;
		case 'r':
			money+=tab[2];
			myRed--;
			break;
			
		default:
			break;
		}
	}

}

Nie czepiajcie sie klasy Game bo jest ona pisana na szybko w celach testowych ;)

Dlaczego co jakiś czas service sie zatrzymuje? (zainstalowalem na swoim tel i co jakis czas sie resetuje)

dodanie znaczników <code class="java"> - fp

0

Sprawdź konsolę, może się crashuje w którymś momencie or something.
Ciężko coś konkretnego stwierdzić.

0

Bo na tel wyglada to tak, że odpalam po zainstalowanu i działa poprawnie przez pare godzin a potem nagle sie resetuje i przy włączeniu aplikacji jakby tworzy sie nowy obiekt game bo wszystko sie resetuje na 100.

0

No ok, ale co wyświetla konsola?
Jakiś błąd? Crash?

0

@krasnolud_kolo a wiesz że Android po prostu ubija czasem aplikacje jeśli brakuje mu zasobów?

0

Spróbuj użyć funkcji startForeground
http://developer.android.com/reference/android/app/Service.html#startForeground(int, android.app.Notification)

Wtedy system nie będzie ubijał service (no chyba że nie będzie miał wyjścia).

0

cos słyszałem, a jak to dokładnie działa ?

0

Spróbuj w onCreate klasy MyService wywołać startForeground().
Jako argument podajesz obiekt klasy Notification, czyli w skrócie ikonkę, która będzie informowała użytkownika, że service sobie działa.

0

Dzieki wielkie. Na razie działa. Jak to w ogóle działa? Z tego co przeczytałem powoduje że android nie zabija jej jak ma mało pamieci, dobrze rozumiem?

0

Raczej "stroni od zabijania jej" :P Ale ubić może tak czy siak jak mu będą potrzebne zasoby ;]

0

public void buttonClicked(View v) w klasie MyService?
Serwisy chyba nie powinny mieć wiele wspólnego z UI!

0

on tylko modyfikuje obiekt game. tak było zrobić to szybciej a tylko chciałem zobaczyć czy serwis bedzie działał

1 użytkowników online, w tym zalogowanych: 0, gości: 1