startservice之后onstartcommand却没有启动

mainactivity代码
package com.example.test_01;

//import android.R;
import java.util.List;

import com.example.service.PlayerService;

import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageButton;

public class MainActivity extends ActionBarActivity
implements MainFragment.OnMainFragmentInteractionListener,
MyMusicFragment.OnMyMusicFragmentInteractionListener
{

//记录当前播放器的状态
private boolean isPause;
private FragmentManager fragmentManager;  
private FragmentTransaction fragmentTransaction;  
private MainFragment mainFragment;  
private MyMusicFragment myMusicFragment;

//查找歌曲的类
private FindSongs finder;
//歌曲列表

public static List mp3Infos;
//音乐的位置
public static int music_position;
//播放按钮控件
private ImageButton play_button;
/*
这个方法是activity和fragment通信的一种方法
在MainFragment中调用这个方法,可以在activity中做出相应的反应
*/

public void onMainFragmentInteraction(int msg){

    /* 
    对其中的参数msg做出判断,如果为CHANGE_TO_MY_MUSIC_FRAGMENT 
    则执行跳转 
     */  
    if(msg == AppConstant.PlayerMsg.CHANGE_TO_MY_MUSIC_FRAGMENT){  

        /* 
        在这里并没有直接切换Fragment 
        而是调用了activity实现MyMusicFragment的那个接口 
        对后面的开发能带来一点便利之处 
         */  
        onMyMusicFragmentInteraction
        (AppConstant.PlayerMsg.CHANGE_TO_MY_MUSIC_FRAGMENT);  
    }  
}  

public void onMyMusicFragmentInteraction(int msg){

    myMusicFragment = new MyMusicFragment(MainActivity.this);       //创建了MyMusicFragment的实例  
    FragmentManager fragmentManager = getFragmentManager();   //得到FragmentManager  
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); //得到fragmentTransaction  



    if(msg == AppConstant.PlayerMsg.CHANGE_TO_MY_MUSIC_FRAGMENT){  

        fragmentTransaction.replace(R.id.fragment_layout, myMusicFragment);  
        fragmentTransaction.addToBackStack(null);       
        //这句话是将被替换的MainFragment加入到一个专门存放fragment的栈中,在回退的时候显示上一个Fragment  
        fragmentTransaction.commit(); 
    }  


    if(msg == AppConstant.PlayerMsg.BACK_TO_MAIN_FRAGMENT){  

        fragmentTransaction.replace(R.id.fragment_layout, mainFragment);  
        fragmentTransaction.addToBackStack(null);  
        fragmentTransaction.commit();  
    }  
}  

public void onMyMusicFragmentInteraction(int msg,int position){

   if(msg == AppConstant.PlayerMsg.LIST_CLICK){  
       if (mp3Infos != null) { 
          // Log.i("dada", "-------------here------------");
           isPause = false;  
           initService(position); 

       }  
   }  

}
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

     music_position = 0;  
        finder = new FindSongs();  
        mp3Infos = finder.getMp3Infos(getContentResolver());  


        play_button = (ImageButton)findViewById(R.id.play_button); 
    //mainFragment = new MainFragment();           
    //创建了刚才定义的MainFragment实例  
    mainFragment = new MainFragment(MainActivity.this); 

    fragmentManager = getFragmentManager();      
    //得到FragmentManager  
    fragmentTransaction = fragmentManager.beginTransaction();   
    //得到fragmentTransaction,用于管理fragment的切换  
    fragmentTransaction.replace(R.id.fragment_layout, mainFragment).commit(); 
    //将MainActivity里的布局模块fragment_layout替换为mainFragment  
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}
private void initService(int position) {  


    music_position = position;  
    Mp3Info mp3Info = mp3Infos.get(position);  


    /* 
    这里新建了一个Intent 
    里面存放各种即将传给Service的数据 
    要启动自定义PlayerService类 
    还需要在AndroidManifest中加入如下代码 

    <service 
        android:name="com.example.dada.myapplication.PlayerService" 
        android:exported="false" 
        > 
    </service> 

     */  
    //Intent intent = new Intent("com.example.service.PlayerService");  
    Intent intent = new Intent(MainActivity.this, PlayerService.class);

    play_button.setImageResource(R.drawable.play_pause);  
    intent.putExtra("url", mp3Info.getUrl());  
    intent.putExtra("title", mp3Info.getTitle());  
    intent.putExtra("artist", mp3Info.getArtist());  
    intent.putExtra("album", mp3Info.getAlbum());  
    intent.putExtra("album_id", mp3Info.getAlbum_id());  
    intent.putExtra("MSG", AppConstant.PlayerMsg.PLAY_MSG);  
    intent.setClass(MainActivity.this, PlayerService.class);  
    startService(intent);  
    Log.w("dada", "------------hahaha----------");
}

//@Override

// public void onFragmentInteraction(int msg) {
// // TODO Auto-generated method stub
//

// }
}

service代码

package com.example.service;

import java.io.IOException;

import com.example.test_01.AppConstant;
import com.example.test_01.AppConstant.PlayerMsg;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;

public class PlayerService extends Service implements AppConstant {

public static MediaPlayer mediaPlayer = null;

private int current_position;  

private String musicPath;  
private String music_artist;  
private String music_title;  
private String notification_msg;
//private MediaPlayer mediaPlayer;

@Override  
public IBinder onBind(Intent intent) {  Log.w("dada", "-------------here------------");
    return null;  

}  
/*
 * onStartCommand()方法就是刚启动service时调用的一个方法
 * 里面第一个参数intent就是在activity中的那个intent
 * 因此里面包含着被点击的歌曲相关信息
 */
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
     //MediaPlayer是android中自带的一个播放器类,直接实例化后使用即可
     mediaPlayer = new MediaPlayer(); 
     Log.w("dada", "-------------here------------");

    try {  
        int msg = intent.getIntExtra("MSG", 0);  
        musicPath = intent.getStringExtra("url");   //从intent中拿出歌曲的路径  
        Log.w("dada", "-------------here------------");
        if (msg == AppConstant.PlayerMsg.PLAY_MSG) { 

            playMusic(0);  
        }  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
    return 0;  
}  

private void playMusic(int position) { 
    Log.w("dada", "-------------here------------");
    try {  
        mediaPlayer.reset();  
        mediaPlayer.setDataSource(musicPath);  
        mediaPlayer.prepare();  
        mediaPlayer.setOnPreparedListener(new MyPreparedListener(position));  

    } catch (IOException e) {  
        e.printStackTrace();  
    }  
}  

private class MyPreparedListener implements MediaPlayer.OnPreparedListener {  

    private int position;  

    public MyPreparedListener(int position) {  
        this.position = position;  
    }  

    public void onPrepared(MediaPlayer mp) {  
        if (position > 0)  
            Log.i("dada", "-------------here------------");
            mediaPlayer.seekTo(position);  
        mediaPlayer.start();  
    }  
}  

private void stopMusic() {  
    if (mediaPlayer != null) {  
        mediaPlayer.pause();  
    }  
}  

public void onDestory() {  Log.e("dada", "-------------here------------");
    if (mediaPlayer != null) {  
        mediaPlayer.stop();  
        mediaPlayer.release();  
    }  
}
}

startService(intent);后面的log显示了,但是service却没有反应

1个回答

按理startService应该是经过onStartCommand的,你override一下oncreate,里面加一下日志试试,看create了吗

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
启动不了service的原因?

小白一枚,最近在学习郭神的第一行代码,关于启动service学习中遇到个问题,代码也反复对照了好几遍确认无误,字有点多希望大神们百忙之中多多鞭策指导,感谢!Orz 开发环境:Android studio 运行环境:API21的系统 **问题内容:** 1 Service启动不了的原因是否是startService()方法处或者是Manifest中的设置问题导致?该如何进行下一步调试? 在学习到第九章启动和停止一个服务按照书中内容照搬,并按书中在创建的MyService类中的各个函数方法中都加上Log输出,运行程序后,点击启动Service的按钮之后,发现Service并没有启动(在应用程序管理运行中没有对应程序服务,Logcat下观察没有对应的Log输出),也没有报异常和错误,debug看了下在点击按钮事件中,startService()语句是执行了的,想知道下一步如何进行调试。 2在回调函数中设置断点是否有用,是否可以像普通函数一样能在debug时停到回调函数中设置的断点处? 这个问题就是上面调试的过程中一直没能将调试过程走到回调函数的断点处,我分析不出来是在回调函数中设置断点就不起作用还是由于自己程序错误根本没有执行到回调函数的原因导致的,所以求指教! **附上代码如下:** MainActivity.class ``` public class MainActivity extends Activity implements OnClickListener { private Button startService; private Button stopService; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); startService = (Button) findViewById(R.id.start_service); stopService = (Button)findViewById(R.id.stop_service); startService.setOnClickListener(this); stopService.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.start_service: Log.d("MyService", "From Activity beefore startService executed"); Intent startIntent = new Intent(this, MyService.class); startService(startIntent); Log.d("MyService", "From Activity after startService executed"); break; case R.id.stop_service: Intent stopIntent = new Intent(this, MyService.class); stopService(stopIntent); break; default: break; } } } ``` MyService.class ``` public class MyService extends Service { @Override public IBinder onBind(Intent intent){ return null; } @Override public void onCreate() { super.onCreate(); Log.d("MyService", "onCreate executed"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d("MyService", "onStartCommand exetuted"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { Log.d("MyService", "onDestroy"); super.onDestroy(); } } ``` Manifest.xml ``` <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.servicetest"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <Service android:name=".MyService"> </Service> </application> </manifest> ``` 调试过程中Logcat输出结果图: ![图片说明](https://img-ask.csdn.net/upload/201612/01/1480588205_927466.png)

android studio启动service没有输出

![图片说明](https://img-ask.csdn.net/upload/201609/30/1475212701_512176.png)想要启动service后在线程中输出EditText的内容,但是真机调试报错没有看到输出,求大神帮忙看下是什么问题。下面贴出代码: activity_main.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="com.vancool.connectservice.MainActivity"> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Hello World!" android:id="@+id/edData"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btnStartService" android:text="启动服务"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btnStopService" android:text="停止服务"/> </LinearLayout> MainActivity.java package com.vancool.connectservice; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private EditText data; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); data = (EditText) findViewById(R.id.edData); findViewById(R.id.btnStartService).setOnClickListener(this); findViewById(R.id.btnStopService).setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.btnStartService: Intent i = new Intent(this, MyService.class); i.putExtra("data", data.getText().toString()); startService(i); break; case R.id.btnStopService: stopService(new Intent(this, MyService.class)); break; default: break; } } } MyService.java package com.vancool.connectservice; import android.app.Service; import android.content.Intent; import android.os.IBinder; public class MyService extends Service { private boolean running = false; private String data = "默认信息"; public MyService() { } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. throw new UnsupportedOperationException("Not yet implemented"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { data = intent.getStringExtra("data"); return super.onStartCommand(intent, flags, startId); } @Override public void onCreate() { super.onCreate(); running = true; new Thread(){ @Override public void run() { super.run(); while(running) { System.out.println(data); try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } @Override public void onDestroy() { super.onDestroy(); running = false; } }

安卓广播启动Service失败的问题

各位大侠好,我的Service可以在主线程启动,输出显示只执行了 onCreate 方法,Service 的 onStart 有一条删除线。但是如果用 BroatcastReceiver 来启动的话,onCreate 也没有输出,请问这是为什么呢?下面是代码: MyBroadcastReceiver.java ``` public class MyBroadcastReceiver extends BroadcastReceiver { private final String TAG = "MyBroadcastReceiver"; @Override public void onReceive(Context context, Intent intent) { Log.v(TAG, context+""); Intent i = new Intent(context, NofyService.class); i.addCategory(Intent.CATEGORY_DEFAULT); //context.startService(i); Log.v(TAG, context.startService(intent)+""); Log.v(TAG, "Receiv"); } } ``` NofyService.java ``` public class NofyService extends Service { private final String TAG = "NofyService"; @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { Log.v(TAG, "onCreate"); super.onCreate(); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); Log.v(TAG, "onstart"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return START_STICKY; } } ``` AndroidManifest.xml ``` <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.cj_finger.dyfin"> <permission android:protectionLevel="normal" android:name=".service.NofyService"></permission> <!-- 权限 --> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <!-- 首页 --> <activity android:name=".activity.MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 新建日程表 --> <activity android:name=".activity.NewActivity"> </activity> <!-- 编辑日程表 --> <activity android:name=".activity.EditActivity"> </activity> <!-- 接收广播 --> <receiver android:name=".broadcastReceiver.MyBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.MY_BROADCAST"/> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver> <!-- 服务 --> <service android:permission=".service.NofyService" android:enabled="true" android:name=".service.NofyService" android:process="com.cj_finger.dyfinService" > <intent-filter> <action android:name=".service.NofyService"/> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service> </application> </manifest> ```

android 启动service出现问题,直接“很抱歉,已停止运行”

在activity的onResume()方法启动服务,直接“很抱歉,已停止运行” protected void onResume() { super.onResume(); if(isNetworkAvailable()) { Log.e("login_resume", "+++++++++++++++++++++++"); Intent service = new Intent(this, GetMsgService.class); startService(service); }else { toast(this); } 我的service是下面的内容,主要是通过一个client启动读写线程,用于socket的传输: import com.example.client.Client; import com.example.client.ClientInputThread; import com.example.client.MessageListener; import com.example.tran.bean.TranObject; import com.example.util.Constants; import com.example.util.SharedPreferencesUtil; import android.app.Application; import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.IBinder; import android.util.Log; public class GetMsgService extends Service{ private MyApplication myApplication; private SharedPreferencesUtil util; private Client client; private Context context = this; private boolean isStart = false;// 是否与服务器连接上 @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); myApplication = (MyApplication) this.getApplicationContext(); client = myApplication.getClient(); Log.e("service_oncreate", "++++++++++++++++++++"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub super.onStartCommand(intent, flags, startId); isStart = client.start(); myApplication.setClientStart(isStart); System.out.print(isStart); Log.e("service", "+++++++++++++++++++++++++++++"); if(isStart) { ClientInputThread inputThread = client.getClientInputThread(); inputThread.setMessageListener(new MessageListener() { @Override public void Message(TranObject tranObject) { // TODO Auto-generated method stub Intent broadcast = new Intent(); broadcast.setAction(Constants.ACTION); broadcast.putExtra(Constants.MSGKEY, tranObject); sendBroadcast(broadcast); } }); } return START_REDELIVER_INTENT; } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } }

android中启动服务的问题

我想在一个活动开始时调用一个服务。 这是Service class: public class UpdaterServiceManager extends Service { private final int UPDATE_INTERVAL = 60 * 1000; private Timer timer = new Timer(); private static final int NOTIFICATION_EX = 1; private NotificationManager notificationManager; public UpdaterServiceManager(){} @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { //code to execute when the service is first created } @Override public void onDestroy() { if (timer != null){ timer.cancel(); } } @Override public int onStartCommand(Intent intent, int flags, int startid) { notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); int icon = android.R.drawable.stat_notify_sync; CharSequence tickerText = "Hello"; long when = System.currentTimeMillis(); Notification notification = new Notification(icon, tickerText, when); Context context = getApplicationContext(); CharSequence contentTitle = "My notification"; CharSequence contentText = "Hello World!"; Intent notificationIntent = new Intent(this, Main.class); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent); notificationManager.notify(NOTIFICATION_EX, notification); Toast.makeText(this, "Started!", Toast.LENGTH_LONG); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { // Check if there are updates here and notify if true } }, 0, UPDATE_INTERVAL); return START_STICKY; } private void stopService() { if(timer != null) timer.cancel(); } } 这是调用Service的方法: Intent serviceIntent = new Intent(); serviceIntent.setAction("cidadaos.cidade.data.UpdaterServiceManager"); startService(serviceIntent); 可结果是没有调用成功。上面的代码块是在activity中的onCreate方法里调用的。我调试过了也没有抛出异常。 请大牛指点错误之处,谢谢。

如何模拟Android Service 被系统回收

官网有关于Service onStartCommand 方法返回值的详细介绍,大概都是系统对 Service回收后再次重启相关的意思吧。但是我想验证系统回收后重启Service的行为, 请问怎么模拟这种行为?

android进程被杀死了怎么自己重新启动?

需求是,有个后台的service,需要一直跑着,但是系统或者360一键清理后,整个应用进程就没了,service也就没了。如何重启?我看了一些资料,说的是写一个守护进程,是两个进程,不是线程噢。网上搜了一些资料: 1,提升Service优先级<intent-filter android:priority="1000"> 2,两个Service相互调用 3,onStartCommand return START_STICKY 4,注册常用广播(但是整个应用的进程都被kill,注册广播有用吗?) 5,在Service的onDestroy中,启动自己 6,设置android:persistent="true" 以上方法,经过测试均不行。我看新浪微博,360,都有两个进程,微博是com.sina.weibo,com.sina.weibo.servant(仆人)这两个进程,后者应该就是守护进程把。360也有com.qihoo360.mobilesafe com.qihoo.daemon(守护进程)。 怎么在一个APK中弄两个进程?求大牛指导下思路。

AlarmManager定时运行没有用

这是一个service的代码: package com.example.cjlhappiness.servicebestpractice; import java.util.Date; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.SystemClock; import android.util.Log; public class ServiceBestPractice extends Service { @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { new Thread(new Runnable() { @Override public void run() { Log.d("LongRunningService", "executed at " + new Date().toString()); } }).start(); AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE); int anHour = 100; long triggerAtTime = SystemClock.elapsedRealtime() + anHour; Intent i = new Intent(this, AlarmManager.class); PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0); manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.d("提示", "onDestroy: "); } } BroadcastReceiver代码: package com.example.cjlhappiness.servicebestpractice; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent i = new Intent(context, ServiceBestPractice.class); context.startService(i); } } 通过Activity里的按钮启动service服务。 没有任何报错信息,安卓4.4版本。 在AlarmReceiver加log没有提示,onReceive方法应该是没有调用过,但第哪里出了问题。 使用提供的源代码可以运行,应该是4.1版本的。

android NDK fork一个守护service的进程保证它被杀后能重新启动

java 端启动一个demoService,demoService启动时就会通过AIDL 启动另外一个进程的guardService <service android:name="com.gdut.persistentservice.demoService" ></service> <service android:name="com.gdut.persistentservice.guradService" android:process="com.gdut.persistentservice.guradService" > <intent-filter> <action android:name="com.gdut.persistentservice.guradService.guard"></action> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service> ``` public int onStartCommand(Intent intent, int flags, int startId) { if(intent==null)return super.onStartCommand(intent, flags, startId); String action = intent.getAction(); if(action==null)return super.onStartCommand(intent, flags, startId); log.d("demoService: onStartCommand:"+action); if(action.equals(START_NATIVATE)){ bindAidlService(this); } return super.onStartCommand(intent, flags, startId); } ``` 在guardService 里通过 JNI 去fork 一个子进程,并且在子进程里启动一个线程,去监控service 我这里为了方便debug观察,就只在fork 出来的父进程 和子进程,都启动一个线程,都去循环打log,观察他们的运行情况,能否在长按home键出来的多任务界面划掉后,能否继续运行 ``` void *thread_run(void* arg){ int count =20;//*((int*)arg); LOGD("native thread count:%d",count); for(int i=0;i<count;i++){ LOGD("native thread run:%d",i); sleep(1); } } void *fork_thread_run(void* arg){ int count =20;//*((int*)arg); LOGD("native thread count:%d",count); for(int i=0;i<count;i++){ LOGD("native fork thread run:%d",i); sleep(1); } } void start_thread(){ pid_t fpid; fpid = fork(); if(fpid<0){ LOGD("native fork error"); }else if(fpid == 0){ LOGD("native fork child"); pthread_t id; int count=10; pthread_create(&id,NULL,fork_thread_run,(void*)&count); }else{ LOGD("native fork parent"); pthread_t id; int count=10; pthread_create(&id,NULL,thread_run,(void*)&count); } } ``` 发现,当程序安装进去后第一次运行,划掉改任务后,子进程的log会继续打,其他进程全被停止了。但是第二次运行,发现子进程会fatal,看NDK 的log, backtrace: #00 pc 0003806c /system/lib/libc.so (nanosleep+8) #01 pc 00021a8f /system/lib/libc.so (sleep+38) #02 pc 00000d65 /data/app/com.gdut.persistentservice-1/lib/arm/libserviceguard.so (fork_thread_run(void*)+44) //00000d65运行的是sleep(1) #03 pc 000137ab /system/lib/libc.so (__pthread_start(void*)+30) #04 pc 0001188b /system/lib/libc.so (__start_thread+6) 发现死在 sleep 方法这里,换成 usleep 也是会死。这里我百思不得其解啊,求高人指点迷津,还是我这种fork 出一个进程再开线程的写法不对啊,求指引明路

关于android app后台防杀问题

app是一个测量运动数据的应用,主要是在用户跑步的时候手机锁屏app也能正常运行,不被系统或第三方清理工具杀掉,有什么好的解决办法吗??不是流氓软件。。。 网上有很多办法, **方法一:在JNI里面fork出子进程** service在单独的进程中,在service中调用JNI的代码,然后fork出一个进程,然后让我们的service进程和fork出来的子进程一直运行. 在5以下是可以的,在5以上无效, 5.0的代码: Process.killProcessQuiet(app.pid); Process.killProcessGroup(app.info.uid, app.pid); 4.3的代码: Process.killProcessQuiet(pid); http://www.aichengxu.com/view/2402010 **方法二:使用推送** 在app中集成小米/友盟/Jpush/信鸽推送,在推送的service中监听要守护进程的情况。 所以,正确的推送方案都是应该如此(不是系统推送,App杀掉都是起不来的) 1.第三方推送方案+小米推送+华为推送(两个系统推送去唤醒 普通推送) 2.如果你是支持国外的应用,记得把,GCM也加上 **方法三:START_STICKY** 在android中,我们使用startService启动服务。在Service的派生类里,会调用onStartCommand(Intent,int,int)来启动服务。 onStartCommand有三种返回值: START_STICKY: 使用这个返回值时,我们启动的服务跟应用程序"粘"在一起,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务。当再次启动服务时,传入的第一个参数将为null; START_NOT_STICKY:使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。 START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。 **方法四: startForeground** 后台运行的服务,被各种手机卫士和内存清理工具一清理或者onLowMemory时就被强行kill掉,有可能是系统回收内存的一种机制,要想避免这种情况可以通过startForeground让服务前台运行,当stopservice的时候通过stopForeground去掉。 **方法五:1 像素在前台** qq的黑科技 但是好像以上方法小米手机都不行。。。使用推送的话,一断网就完蛋了,求高手支招

安卓,service,不调用ondestory()方法,并强退,怎么办?

代码如下,本应按下第二个按钮就调用service的ondestory方法,但没有,并且会强退。 activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" android:orientation="vertical"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="打开service"/> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="销毁service"/> </LinearLayout> java代码如下: package com.example.test_service; import android.os.Bundle; import android.widget.*; import android.app.Activity; import android.view.Menu; import android.app.Service; import android.os.IBinder; import android.content.Intent; import android.view.View.OnClickListener; import android.view.View; public class MainActivity extends Activity { Button but=null; Button but2=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); but=(Button)super.findViewById(R.id.button); but2=(Button)super.findViewById(R.id.button2); but.setOnClickListener(new OnClickListenerimpl()); but2.setOnClickListener(new OnClickListenerimpl2()); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } class OnClickListenerimpl implements OnClickListener { public void onClick(View v) { startService(new Intent(MainActivity.this,Test.class)); } } class OnClickListenerimpl2 implements OnClickListener { public void onClick(View v) { stopService(new Intent(MainActivity.this,Test.class)); } } } 另外该service的类如下: package com.example.test_service; import android.app.Service; import android.content.Intent; import android.os.IBinder; public class Test extends Service { public IBinder onBind(Intent intent) { return null; } public void onCreate() { System.out.println("现在create了service"); } public int onStartCommand(Intent intent,int flag,int startId) { System.out.println("现在启动service,启动的id是"+startId); return Service.START_CONTINUATION_MASK; } public void onDestory() { System.out.println("现在销毁service"); } } 另外,在AndroidMainfest.xml中已添加如下语句: <service android:name=".Test"/> 按下“打开service”按钮,logcat如下图: ![图片说明](https://img-ask.csdn.net/upload/201511/25/1448434665_954634.png) 按下“销毁service",后台并不会输出相应的信息,而是等一段时间后就会如图: ![图片说明](https://img-ask.csdn.net/upload/201511/25/1448434712_930375.png) 此时也会弹出提示框要强退: ![图片说明](https://img-ask.csdn.net/upload/201511/25/1448434738_234231.png) 请问是什么问题?应该怎么解决?

通过Handler实现Service和Activity的数据交互,与onbind返回Binder对象冲突,我该如何解决?

在做service和activity通讯,需要服务能够控制活动的运行,同时能够实时进行数据传输 我通过Handler实现Service和Activity的数据交互,但尴尬的是onBind已经用于传递BleBind的一个实例了,没办法return messenger.getBinder(); ``` package com.example.bluserver; import android.app.Service; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.Context; import android.content.Intent; import android.os.Binder; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.Messenger; import android.util.Log; import android.widget.TextView; import android.widget.Toast; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.UUID; public class bluService extends Service { public static final int MSG = 123; private static final String TAG = "BleService"; private BluetoothAdapter mBA; private Context mContext; private final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");//这是蓝牙透传的uuid // 这里本身即是服务端也是客户端,需要如下类 private BluetoothSocket mSocket; private BluetoothDevice mOldDevice; private BluetoothDevice mCurDevice; // 输出流_客户端需要往服务端输出 private OutputStream os; private Messenger mActivityMessenger; private BleBinder bleBinder=new BleBinder(); @Override public IBinder onBind(Intent intent) { Messenger messenger=new Messenger(handler); //return messenger.getBinder();//Handler实现Service和Activity的数据交互 return bleBinder;//返回BleBinder实例供活动调用 } class BleBinder extends Binder{//以下是以供调用的公共方法 //开始读取传感器数据 public void startread(){ { new Thread(new Runnable() { @Override public void run() { try { Log.d(TAG,"开始运行run()函数"); InputStream is = mSocket.getInputStream(); Log.d(TAG,"已获取输入流"); while (true) { synchronized (this) { //Log.d(TAG,"已获取锁"); //Thread.sleep(50); byte[] tt = new byte[is.available()]; if (tt.length > 0) { is.read(tt, 0, tt.length); Message msg = new Message(); msg.obj = new String(tt, "GBK"); //大概在这里要获取整个字符串,字符串以回车分割,如此才能准确识别 Log.e(TAG, "客户端:" + msg.obj); showToast("客户端:" + msg.obj); mActivityMessenger.send(msg); //handler.sendMessage(msg); } } } } catch (Exception e) { e.printStackTrace(); } } }).start(); } } public void stopread(){}//停止读取传感器数据 /** * 弹出Toast窗口 * * @param message */ private void showToast(String message) { if (mContext != null) { Toast.makeText(mContext, message, Toast.LENGTH_LONG).show(); } else { Log.e(TAG, "message:" + message); } } /** * 主动连接蓝牙 * * @param device */ public void connectDevice(BluetoothDevice device) { // 判断是否在搜索,如果在搜索,就取消搜索 if (mBA.isDiscovering()) { mBA.cancelDiscovery(); } try { // 获得远程设备 Log.e(TAG, "开始检索"); if (mCurDevice == null || mCurDevice != mOldDevice) { mCurDevice = mBA.getRemoteDevice(device.getAddress()); Log.e(TAG, device.getAddress()); mOldDevice = mCurDevice; Log.e(TAG, "device:" + mCurDevice); mSocket = mCurDevice.createRfcommSocketToServiceRecord(MY_UUID); // 连接 mSocket.connect(); // 获得输出流 os = mSocket.getOutputStream(); Log.e(TAG, "获取输入流"); startread(); Log.e(TAG, "开启读线程"); //intent流转byte数组 // byte[] input=ByteToInputStream.input2byte(mSocket.getInputStream()); // Intent intent=new Intent(); // intent.putExtra("inputstream",input); // mContext.startActivity(intent); } // 如果成功获得输出流 Log.e(TAG, "3"); } catch (IOException e) { e.printStackTrace(); } } /** * 判断是否打开蓝牙 * * @return */ public boolean isEnabled() { if (mBA.isEnabled()) { return true; } return false; } /** * 传输数据 * * @param message */ public void write(String message) { try { if (os != null) { os.write(message.getBytes("GBK")); } Log.e(TAG, "write:" + message); } catch (IOException e) { e.printStackTrace(); } } public BluetoothDevice getCurDevice() { return mCurDevice; } } public bluService() { mBA = BluetoothAdapter.getDefaultAdapter(); } private Handler handler = new Handler() { public void handleMessage(Message msg) { //Toast.makeText(this,String.valueOf(msg.obj),Toast.LENGTH_LONG); //将在此处向主线程发送信息,用于更新界面(已废弃) //将在此处处理来自活动的消息,发送消息在线程内 // 参考代码 https://blog.csdn.net/CodeNoodles/article/details/51679532 switch (msg.what){ case MSG: mActivityMessenger = msg.replyTo; break; } Log.e(TAG, "服务端:" + msg.obj); super.handleMessage(msg); } }; @Override public void onDestroy() { Log.d(TAG,"服务已销毁"); super.onDestroy(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG,"服务已启动"); return super.onStartCommand(intent, flags, startId); } @Override public void onCreate() { super.onCreate(); Log.d(TAG,"服务已创建"); } } ```

在service里使用加速度传感器,软件却始终闪退

不知道为什么,明明我的service结构也没写错,做些小事也可以,但是将传感器放在里面运行就会导致程序闪退。 代码如下: ``` @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); bt=(Button)view.findViewById(R.id.startSpeed); t1=(TextView)view.findViewById(R.id.showSpeed); //接受service发出的广播,注册监听 rec = new MyReceiver(); getActivity().registerReceiver(rec,new IntentFilter("fromSpeedService")); /*开始测速监听*/ bt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //获取服务对象 Intent it= new Intent(getActivity(), SpeedService.class); //检测服务是否已经在运行,防止二次启动 if(isServiceRunning()) Toast.makeText(getActivity(),"测速服务已在运行",Toast.LENGTH_SHORT).show(); else{ getActivity().startService(it); Toast.makeText(getActivity(),"已开始后台测速",Toast.LENGTH_SHORT).show(); } } }); } //接受广播消息处理 private class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent){ t1.setText(intent.getStringExtra("i")); } } ``` ``` public class SpeedService extends Service { private final String TAG="dd"; private TextView t1,t2,t3,t4,t5; private SensorManager speedManager; private Sensor sensor; private Listener listener; private Intent it; private PowerManager powerManager=null; private PowerManager.WakeLock wakeLock =null; public SpeedService() { it=new Intent("fromSpeedService"); } @Override public void onCreate(){ super.onCreate(); new Thread(new Runnable() { @Override public void run() { /*int i=10; it.putExtra("i",Integer.toString(i)); sendBroadcast(it);*/ //获取传感器管理器 speedManager=(SensorManager)getSystemService(SENSOR_SERVICE); //检测是否存在该传感器 sensor=speedManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION); if(sensor==null) { Toast.makeText(SpeedService.this,"不存在加速度传感器!",Toast.LENGTH_SHORT).show(); } else{ //给传感器注册监听器 listener=new Listener(); speedManager.registerListener(listener,sensor,SensorManager.SENSOR_DELAY_NORMAL); Toast.makeText(SpeedService.this,"111111",Toast.LENGTH_SHORT).show(); } /* powerManager=(PowerManager)getSystemService(Context.POWER_SERVICE); wakeLock=powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK,this.getClass().getName()); wakeLock.acquire();*/ } }).start(); } @Override public IBinder onBind(Intent intent) { throw new UnsupportedOperationException("Not yet impelmented"); } //启动service @Override public int onStartCommand(Intent intent,int flags,int startId){ return super.onStartCommand(intent,flags,startId); } //结束服务时取消注册监听 @Override public void onDestroy(){ speedManager.unregisterListener(listener); super.onDestroy(); } //重载的传感器监听器类 private class Listener implements SensorEventListener { @Override public void onAccuracyChanged(Sensor sensor, int accuracy){ } @Override public void onSensorChanged(SensorEvent event) { int sensorType=event.sensor.getType(); //获取传感器类型 if(sensorType==Sensor.TYPE_LINEAR_ACCELERATION){ float[] value=event.values; float acc=(float)Math.sqrt(Math.pow(value[0],2)+Math.pow(value[1],2)+Math.pow(value[2],2)); String aa=Integer.toString(Math.round(acc)); it.putExtra("i",aa); sendBroadcast(it); } } //处理速度与加速度 public void handleData(int speed,int Aspeed){ } } } ``` 麻烦大佬们帮我看一下,这个service我是通过fragment里的一个按钮启动的,但每次一启动程序就闪退,头发都要愁掉光了。。。

[Android]Service里面发送广播消息出现问题[内有代码]

package com.sample; // MainActivity.java import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class MainActivity extends Activity { private Button btnStart; private Button btnStop; private EditText editShow; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnStart = (Button)findViewById(R.id.startButton); btnStop = (Button)findViewById(R.id.stopButton); editShow = (EditText) findViewById(R.id.editShow); btnStart.setOnClickListener(startListener); btnStop.setOnClickListener(stopListener); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(".myBroadcastAction"); this.registerReceiver(new myBroadcastReciver(), intentFilter); } private OnClickListener startListener = new OnClickListener() { public void onClick(View v) { startService(new Intent(MainActivity.this, BackgroundService.class)); } }; private OnClickListener stopListener = new OnClickListener() { public void onClick(View v) { stopService(new Intent(MainActivity.this,BackgroundService.class)); } }; private class myBroadcastReciver extends BroadcastReceiver{ @Override public void onReceive(Context arg0, Intent arg1) { String str = "null"; if(arg1.getAction().equals(".myBroadcastAction")){ str = arg1.getStringExtra("data"); } editShow.setText(str); } } } //service package com.sample; // BackgroundService.java import java.io.IOException; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.widget.Toast; public class BackgroundService extends Service { private String sMsg = ""; @Override public IBinder onBind(Intent arg0) { return null; } @Override public void onCreate() { super.onCreate(); Toast.makeText(this, "Crete", Toast.LENGTH_SHORT).show(); System.out.println("Create"); } @Override public int onStartCommand(Intent intent, int flags, int startId){ super.onStartCommand(intent, flags, startId); Toast.makeText(this, "service Start", Toast.LENGTH_SHORT).show(); System.out.println("service start"); startThread();//启动线程 return START_STICKY; } private void startThread() { new Thread(){ public void run(){ Intent intent = new Intent(); int i = 0; while(true){ try{ Thread.sleep(5000); }catch(Exception e){ e.printStackTrace(); } i++; intent.setAction(".myBroadcastAction"); intent.putExtra("data", i+""); sendBroadcast(intent); } } }.start(); } @Override public void onDestroy() { super.onDestroy(); Toast.makeText(this, "service stop", Toast.LENGTH_SHORT).show(); System.out.println("service stop"); } } //xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.sample" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 广播注册 --> <receiver android:name = ".broadcastReciver"> <intent-filter android:priority="20"> <action android:name=".myBroadcastAction"/> </intent-filter> </receiver> <service android:name="com.sample.BackgroundService" /> </application> </manifest> 错误信息: ![CSDN移动问答][1] [1]: http://img.my.csdn.net/uploads/201306/07/1370587239_3382.png

接受到了广播,但不能弹出提示和启动服务

监听的广播是: ``` <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> ``` Manifest 代码: ``` <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.testbroadcastreceiver"> <!--电话钻港台--> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter android:priority="99999"> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".MyService"/> <!--需要注意的是,监听广播往往需要添加响应的权限,监听外拨电话的声明如下,6.0以上需要动态申请权限:--> <receiver android:name=".MyBroadcastReceiver" android:enabled="true" android:exported="true" android:permission="android.permission.PROCESS_OUTGOING_CALLS"> <intent-filter android:priority="-1"> <!--NEW_OUTGOING_CALL 监听外拨电话--> <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> </intent-filter> </receiver> </application> </manifest> ``` 广播的代码: ``` <receiver android:name=".MyBroadcastReceiver" android:enabled="true" android:exported="true" android:permission="android.permission.PROCESS_OUTGOING_CALLS"> <intent-filter android:priority="-1"> <!--NEW_OUTGOING_CALL 监听外拨电话--> <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> </intent-filter> </receiver> ``` (注:广播的权限在开启应用程序时已经动态获取了) 广播类的主要代码: ``` public void onReceive(Context context, Intent intent) { Log.i(TAG,"接收到了广播============================================="); //接受到了广播 try { Toast.makeText(context,"接受到了广播",Toast.LENGTH_LONG).show(); Intent intent1 = new Intent(context,MyService.class); context.startService(intent1); Log.i(TAG,"接收到了广播111"+context); }catch (Exception e){ e.printStackTrace(); Log.i(TAG,"接收到了广播2222"); } } ``` 服务类的主要代码: ``` @Override public void onCreate() { super.onCreate(); Toast.makeText(this,"收到了广播",Toast.LENGTH_LONG).show(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Toast.makeText(this,"收到了广播————————---",Toast.LENGTH_LONG).show(); return super.onStartCommand(intent, flags, startId); } ``` 打印的日志 : ``` 11-01 13:22:46.612 27292-27292/com.example.testbroadcastreceiver I/Test :MainActivity-->: 活动onPause()状态 ------ 11-01 13:22:46.665 27292-27292/com.example.testbroadcastreceiver I/Test :MainActivity-->: 活动 onStop()------当一个Activity被另一个Activity完全覆盖时,被覆盖的Activity就会进入Stopped状态,此时它不再可见,但是跟Paused状态一样保持着其所有状态信息及其成员变量。 11-01 13:22:53.860 27292-27292/com.example.testbroadcastreceiver I/Test :MyBroadcastReceiver-->: 接收到了广播============================================= 11-01 13:22:53.872 27292-27292/com.example.testbroadcastreceiver I/Test :MyBroadcastReceiver-->: 接收到了广播111android.app.ReceiverRestrictedContext@8412aff 11-01 13:24:04.562 27292-27305/com.example.testbroadcastreceiver I/IPCThreadState: Application 11-01 13:24:04.564 27292-27305/com.example.testbroadcastreceiver E/SchedPolicy: set_thread_freeze_state, freeze=1, pid=27292, num=15 ```

android开发。希望开机发送一个notification,未能实现。

总体思想是:接收RECEIVE_BOOT_COMPLETED广播,启动一个service,在service内发送notification。 结果是开机启动没有发送notification,logcat里显示android.os.deadObjectException。 我在程序里的文本框用click事件启动service是可以发送notification的。 代码如下: Mainfest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.credao.repeater"> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".SMSAndCallMonitorService" android:enabled="true" android:exported="true"> </service> <receiver android:name=".OnBootStartReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </receiver> </application> </manifest> 接收RECEIVE_BOOT_COMPLETED广播的接收器: package com.credao.repeater; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class OnBootStartReceiver extends BroadcastReceiver { public OnBootStartReceiver() { } @Override public void onReceive(Context context, Intent intent) { // TODO: start SMSAndCallMonitorService Intent i=new Intent(); i.setClassName("com.credao.repeater","com.credao.repeater.SMSAndCallMonitorService"); context.startService(i); } } Service: package com.credao.repeater; import android.app.Notification; import android.app.NotificationManager; import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.IBinder; import android.util.Log; import android.widget.Toast; public class SMSAndCallMonitorService extends Service { public SMSAndCallMonitorService() { } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. throw new UnsupportedOperationException("Not yet implemented"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.w("service", "SMSAndCallMonitorService onstartcommand"); Notification.Builder notification=new Notification.Builder(this); notification.setContentTitle("SMSAndCallMonitorService") .setContentText("onStartCommand()") .setSmallIcon(R.drawable.ic_stat_name); NotificationManager nm= (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); nm.notify(1,notification.build()); stopSelf(); return super.onStartCommand(intent,flags,startId); } } Activity中可以正常启动service中notification的代码: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); View text=findViewById(R.id.text); text.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i=new Intent(); i.setClassName("com.credao.repeater","com.credao.repeater.SMSAndCallMonitorService"); MainActivity.this.startService(i); Log.w("text: ", "text is clicked"); } }); } 错误提示: 2209-3577/? E/IndexSearchManager﹕ MSG_BOOTCOMPLETE mService.bootCompleted error android.os.DeadObjectException at android.os.BinderProxy.transactNative(Native Method) at android.os.BinderProxy.transact(Binder.java:617) at com.huawei.indexsearch.IndexSearchManager$IndexSearchManagerProxy.bootCompleted(IndexSearchManager.java:365) at com.huawei.indexsearch.IndexSearchManager.handleBootCompleted(IndexSearchManager.java:150) at com.huawei.indexsearch.IndexSearchManager.-wrap2(IndexSearchManager.java) at com.huawei.indexsearch.IndexSearchManager$IndexSearchHandler.handleMessage(IndexSearchManager.java:137) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:156) at android.os.HandlerThread.run(HandlerThread.java:61)

MediaRecorder录屏,Socket传输录屏内容报错java.lang.IllegalStateException

用模拟器调试可以运行,用真机测试在 mediaRecorder.prepare();抛异常 ``` package www.xjw.com.mymiracast2.screenrecordservice; import android.app.Notification; import android.app.Service; import android.content.Context; import android.content.Intent; import android.hardware.display.DisplayManager; import android.hardware.display.VirtualDisplay; import android.media.MediaRecorder; import android.media.projection.MediaProjection; import android.media.projection.MediaProjectionManager; import android.os.IBinder; import android.os.ParcelFileDescriptor; import java.net.Socket; /** * Created by dzjin on 2018/1/9. */ public class ScreenRecordService extends Service { private int resultCode; private Intent resultData=null; private MediaProjection mediaProjection=null; private MediaRecorder mediaRecorder=null; private VirtualDisplay virtualDisplay=null; private int mScreenWidth; private int mScreenHeight; private int mScreenDensity; private static String filePathName; private Socket receiver = null; private ParcelFileDescriptor pfd = null; private Context context=null; private String host = null; private int port = 8989; @Override public void onCreate() { super.onCreate(); //startForeground(2, new Notification()); } /** * 每次客户端通过调用startService(Intent)显式启动服务时,系统调用startService(Intent), *提供它提供的参数和表示启动请求的唯一整数标记。 * 不要直接调用这个方法。 * @param intent * @param flags * @param startId * @return */ @Override public int onStartCommand(Intent intent, int flags, int startId) { try{ resultCode=intent.getIntExtra("resultCode",-1); resultData=intent.getParcelableExtra("resultData"); mScreenWidth=intent.getIntExtra("mScreenWidth",0); mScreenHeight=intent.getIntExtra("mScreenHeight",0); mScreenDensity=intent.getIntExtra("mScreenDensity",0); filePathName=intent.getStringExtra("filePathName"); host=intent.getStringExtra("host"); port=intent.getIntExtra("port",8989); receiver = new Socket(host, port); pfd = ParcelFileDescriptor .fromSocket(receiver); mediaProjection=createMediaProjection(); mediaRecorder=createMediaRecorder(); virtualDisplay=createVirtualDisplay(); mediaRecorder.start(); }catch (Exception e) { e.printStackTrace(); } /** * START_NOT_STICKY: *从onStartCommand返回的常量(Intent, int, int):如果这个服务的进程是 *在启动时被杀死(从onStartCommand(Intent, int, int)返回后), *没有新的start意图交付给它,然后将服务从 *启动状态,在以后显式调用Context.startService(Intent)之前不要重新创建。 *服务将不会接收带有空意图的onStartCommand(Intent, int, int)调用 *因为如果没有等待交付的意图,它将不会重新启动。 */ return Service.START_NOT_STICKY; } public MediaProjection createMediaProjection(){ /** *使用getSystemService(类)检索MediaProjectionManager实例 *管理媒体放映会议。 */ return ((MediaProjectionManager)getSystemService(Context.MEDIA_PROJECTION_SERVICE)) .getMediaProjection(resultCode,resultData); /** *检索从成功的屏幕捕获请求中获得的MediaProjection。 *如果startActivityForResult()的结果不是RESULT_OK,则*将为null。 */ } private MediaRecorder createMediaRecorder(){ //用于录制音频和视频。录音控制是基于一个简单的状态机。 MediaRecorder mediaRecorder=new MediaRecorder(); //设置要录音的源。 //mediaRecorder.setAudioSource(MediaRecorder. AudioSource.CAMCORDER); //设置要录制的视频源。 mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); //设置录制过程中产生的输出的格式。 //3GPP媒体文件格式 mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS); //设置录音格式 //mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //设置录像编码比特率。 //param:以比特/秒为单位的视频编码比特率 mediaRecorder.setVideoEncodingBitRate(5*mScreenWidth*mScreenHeight); //设置录像编码器用于录像。 mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); //设置要拍摄的视频的宽度和高度。 mediaRecorder.setVideoSize(mScreenWidth,mScreenHeight); //设置要捕获视频的帧速率。 mediaRecorder.setVideoFrameRate(60); try{ mediaRecorder.setOutputFile(pfd.getFileDescriptor()); //mediaRecorder.setOutputFile(filePathName); **此次抛异常** //准备记录器开始捕捉和编码数据。 mediaRecorder.prepare(); }catch (Exception e){ e.printStackTrace(); } return mediaRecorder; } private VirtualDisplay createVirtualDisplay(){ /** *名称字符串:虚拟显示的名称,必须是非空的。这个值不能为空。 width int:虚拟显示的宽度,以像素为单位。必须大于0。 高度int:虚拟显示器的高度,以像素为单位。必须大于0。 dpi int: dpi中虚拟显示的密度。必须大于0。 标志int:虚拟显示标志的组合。有关标志的完整列表,请参见DisplayManager。 surface surface:虚拟显示内容应该呈现到的表面,如果一开始没有,则为null。 回调virtualdisplay。回调:当虚拟显示的状态改变时调用的回调,如果没有,则为空。 处理程序处理程序:应该在其上调用回调的处理程序,如果应该在调用线程的主循环程序上调用回调,则为null。 */ /** * DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR *虚拟显示标志:当没有显示内容时,允许在私有显示上镜像内容。 */ return mediaProjection.createVirtualDisplay("mediaProjection",mScreenWidth,mScreenHeight,mScreenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,mediaRecorder.getSurface(),null,null); } @Override public void onDestroy() { super.onDestroy(); if(virtualDisplay!=null){ virtualDisplay.release(); virtualDisplay=null; } if(mediaRecorder!=null){ mediaRecorder.stop(); mediaRecorder=null; } if(mediaProjection!=null){ mediaProjection.stop(); mediaProjection=null; } } @Override public IBinder onBind(Intent intent) { System.out.println("==============================="); return null; } } ``` I/MediaRecorder: enter in file frameworks/av/media/libmedia/mediarecorder.cpp, function prepare, line 461 I/IMediaRecorder: prepare (BpMediaRecorder client) in file frameworks/av/media/libmedia/IMediaRecorder.cpp, function prepare, line 249 W/com.mymiracast2: type=1400 audit(0.0:104572): avc: denied { read write } for path="socket:[8870267]" dev="sockfs" ino=8870267 scontext=u:r:mediaserver:s0 tcontext=u:r:untrusted_app:s0:c512,c768 tclass=tcp_socket permissive=0 E/MediaRecorder: prepare failed: -38 W/zygote64: Got a deoptimization request on un-deoptimizable method void android.media.MediaRecorder._prepare() W/System.err: java.lang.IllegalStateException W/System.err: at android.media.MediaRecorder._prepare(Native Method) W/System.err: at android.media.MediaRecorder.prepare(MediaRecorder.java:1017) W/System.err: at www.xjw.com.mymiracast2.screenrecordservice.ScreenRecordService.createMediaRecorder(ScreenRecordService.java:137) W/System.err: at www.xjw.com.mymiracast2.screenrecordservice.ScreenRecordService.onStartCommand(ScreenRecordService.java:79) W/System.err: at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4151) W/System.err: at android.app.ActivityThread.-wrap21(Unknown Source:0) W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2119) W/System.err: at android.os.Handler.dispatchMessage(Handler.java:108) W/System.err: at android.os.Looper.loop(Looper.java:166) W/System.err: at android.app.ActivityThread.main(ActivityThread.java:7529) W/System.err: at java.lang.reflect.Method.invoke(Native Method) W/System.err: at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245) W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921) E/MediaRecorder: SurfaceMediaSource could not be initialized! W/System.err: java.lang.IllegalStateException: failed to get surface at android.media.MediaRecorder.getSurface(Native Method) W/System.err: at www.xjw.com.mymiracast2.screenrecordservice.ScreenRecordService.createVirtualDisplay(ScreenRecordService.java:160) at www.xjw.com.mymiracast2.screenrecordservice.ScreenRecordService.onStartCommand(ScreenRecordService.java:80) W/System.err: at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4151) at android.app.ActivityThread.-wrap21(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2119) at android.os.Handler.dispatchMessage(Handler.java:108) W/System.err: at android.os.Looper.loop(Looper.java:166) at android.app.ActivityThread.main(ActivityThread.java:7529) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245) W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921) D/StrictMode: StrictMode policy violation; ~duration=7334 ms: android.os.StrictMode$StrictModeNetworkViolation: policy=65543 violation=4 at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1466) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:356) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:201) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:183) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356) at java.net.Socket.connect(Socket.java:616) at java.net.Socket.connect(Socket.java:565) at java.net.Socket.<init>(Socket.java:445) at java.net.Socket.<init>(Socket.java:217) at www.xjw.com.mymiracast2.screenrecordservice.ScreenRecordService.onStartCommand(ScreenRecordService.java:74) at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4151) at android.app.ActivityThread.-wrap21(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2119) at android.os.Handler.dispatchMessage(Handler.java:108) at android.os.Looper.loop(Looper.java:166) at android.app.ActivityThread.main(ActivityThread.java:7529) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921) D/StrictMode: StrictMode policy violation; ~duration=7332 ms: android.os.StrictMode$StrictModeNetworkViolation: policy=65543 violation=4 ``` ```

请问在服务中是否无法关闭服务呢???

``` public class MyService extends Service { private MyReceiver receiver; private class MyReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { onDestroy(); } } public void onCreate() { super.onCreate(); Toast.makeText(MyService.this, "服务已启动", Toast.LENGTH_SHORT).show(); } public int onStartCommand(Intent intent, int flags, int startId) { receiver=new MyReceiver(); IntentFilter filter=new IntentFilter(); filter.addAction("net.s5c.Changelink.wifiOff"); registerReceiver(receiver, filter); flags=START_STICKY; return super.onStartCommand(intent, flags, startId); } public void onDestroy() { Toast.makeText(this, "服务已关闭", Toast.LENGTH_LONG).show();//可以打印出这句,但看后台还是无法关闭服务! super.onDestroy(); } public IBinder onBind(Intent intent) { return null; } } ``` 收到广播后能看到输出的onDestroy()的内容,但看正在运行中服务还是继续运行着,这是怎么回事呢?

如何将简单的Go脚本作为Android服务运行?

<div class="post-text" itemprop="text"> <p>I have the following Go script (<strong>testapp.go</strong>) that I would like to keep running as a background service:</p> <pre><code>package main import( "net/http" "time" "log" "golang.org/x/mobile/app" ) func main() { app.Main(func(a app.App) { for { req, err := http.NewRequest( "GET", "http://0.0.0.0:88/fetch_news", strings.NewReader("topic.title") ) if err != nil { log.Print(err) } cli := &amp;http.Client{} res, err := cli.Do(req) if err != nil { log.Print(err) } else { defer res.Body.Close() body, _ := ioutil.ReadAll(res.Body) returnStr := string(body) // Do something with returnStr } time.Sleep(8 * time.Second) } }) } </code></pre> <p>My <strong>GoNativeActivity.java</strong> looks like this:</p> <pre><code>package org.golang.app; import android.app.Activity; import android.app.NativeActivity; import android.content.Context; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.KeyCharacterMap; public class GoNativeActivity extends NativeActivity { private static GoNativeActivity goNativeActivity; public GoNativeActivity() { super(); goNativeActivity = this; } String getTmpdir() { return getCacheDir().getAbsolutePath(); } int getRune(int deviceId, int keyCode, int metaState) { try { int rune = KeyCharacterMap.load(deviceId).get(keyCode, metaState); if (rune == 0) { return -1; } return rune; } catch (KeyCharacterMap.UnavailableException e) { return -1; } catch (Exception e) { Log.e("Go", "exception reading KeyCharacterMap", e); return -1; } } private void load() { // Interestingly, NativeActivity uses a different method // to find native code to execute, avoiding // System.loadLibrary. The result is Java methods // implemented in C with JNIEXPORT (and JNI_OnLoad) are not // available unless an explicit call to System.loadLibrary // is done. So we do it here, borrowing the name of the // library from the same AndroidManifest.xml metadata used // by NativeActivity. try { ActivityInfo ai = getPackageManager().getActivityInfo( getIntent().getComponent(), PackageManager.GET_META_DATA); if (ai.metaData == null) { Log.e("Go", "loadLibrary: no manifest metadata found"); return; } String libName = ai.metaData.getString("android.app.lib_name"); System.loadLibrary(libName); } catch (Exception e) { Log.e("Go", "loadLibrary failed", e); } } @Override public void onCreate(Bundle savedInstanceState) { load(); super.onCreate(savedInstanceState); Intent intent = new Intent(this, org.golang.app.GoNativeService.class); startService(intent); } } </code></pre> <p>My <strong>GoNativeService.java</strong> looks like this:</p> <pre><code>package org.golang.app; import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class GoNativeService extends IntentService { @Override public void onStart(Intent intent, int startId) { Toast.makeText(this,"Service started. onStart()", Toast.LENGTH_SHORT).show(); handleCommand(intent); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Toast.makeText(this,"Service started. onStartCommand()", Toast.LENGTH_SHORT).show(); handleCommand(intent); // We want this service to continue running until it is explicitly // stopped, so return sticky. return START_STICKY; } } </code></pre> <p>My <strong>AndroidManifest.xml</strong> file looks like this:</p> <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.golang.todo.testapp" android:versionCode="1" android:versionName="1.0"&gt; &lt;uses-permission android:name="android.permission.INTERNET" /&gt; &lt;application android:label="Testapp" android:debuggable="true"&gt; &lt;activity android:name="org.golang.app.GoNativeActivity" android:label="Testactivity" android:configChanges="orientation|keyboardHidden"&gt; &lt;meta-data android:name="android.app.lib_name" android:value="testapp" /&gt; &lt;intent-filter&gt; &lt;action android:name="android.intent.action.MAIN" /&gt; &lt;category android:name="android.intent.category.LAUNCHER" /&gt; &lt;/intent-filter&gt; &lt;/activity&gt; &lt;service android:name="org.golang.app.GoNativeService" android:enabled="true" android:exported="true" /&gt; &lt;/application&gt; &lt;/manifest&gt; </code></pre> <p>This is my work environment:</p> <pre><code>GOARCH="amd64" GOBIN="/root/go/bin" GOCACHE="/root/.cache/go-build" GOHOSTARCH="amd64" GOHOSTOS="linux" GOOS="linux" GOPATH="/root/go" GOROOT="/usr/lib/go-1.10" GOTMPDIR="" GOTOOLDIR="/usr/lib/go-1.10/pkg/tool/linux_amd64" </code></pre> <p>This is what my <strong>$GOPATH/src/testapp</strong> directory looks like:</p> <pre><code>testapp/ assets/ icon.png AndroidManifest.xml testapp.go </code></pre> <p>This is what my <strong>$GOPATH/src/golang.org/x/mobile/app</strong> directory looks like:</p> <pre><code>app/ android.c app_test.go darwin_armx.go GoNativeActivity.java GoNativeService.java internal/ x11.go android.go darwin_amd64.go darwin_armx.m shiny.go app.go darwin_amd64.m doc.go x11.c </code></pre> <p>How can I run my Go script as a background service on Android, so that when the app is exited (MainActivity closes), the background service will continue to fetch news messages?</p> <p>Note: I am monitoring the requests at my webserver on port 88. I can run the script fine while <code>GoNativeActivity</code> is active, but I would like to know how to build a native app that starts a background service.</p> <p>Any answers or attempts to point me in the right direction would be appreciated!</p> </div>

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

你以为这样写Java代码很6,但我看不懂

为了提高 Java 编程的技艺,我最近在 GitHub 上学习一些高手编写的代码。下面这一行代码(出自大牛之手)据说可以征服你的朋友,让他们觉得你写的代码很 6,来欣赏一下吧。 IntStream.range(1, 5).boxed().map(i -&gt; { System.out.print("Happy Birthday "); if (i == 3) return "dear NAME"...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

程序员写出这样的代码,能不挨骂吗?

当你换槽填坑时,面对一个新的环境。能够快速熟练,上手实现业务需求是关键。但是,哪些因素会影响你快速上手呢?是原有代码写的不够好?还是注释写的不够好?昨夜...

带了6个月的徒弟当了面试官,而身为高级工程师的我天天修Bug......

即将毕业的应届毕业生一枚,现在只拿到了两家offer,但最近听到一些消息,其中一个offer,我这个组据说客户很少,很有可能整组被裁掉。 想问大家: 如果我刚入职这个组就被裁了怎么办呢? 大家都是什么时候知道自己要被裁了的? 面试软技能指导: BQ/Project/Resume 试听内容: 除了刷题,还有哪些技能是拿到offer不可或缺的要素 如何提升面试软实力:简历, 行为面试,沟通能...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

程序员为什么千万不要瞎努力?

本文作者用对比非常鲜明的两个开发团队的故事,讲解了敏捷开发之道 —— 如果你的团队缺乏统一标准的环境,那么即使勤劳努力,不仅会极其耗时而且成果甚微,使用...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

Python爬虫,高清美图我全都要(彼岸桌面壁纸)

爬取彼岸桌面网站较为简单,用到了requests、lxml、Beautiful Soup4

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

Java岗开发3年,公司临时抽查算法,离职后这几题我记一辈子

前几天我们公司做了一件蠢事,非常非常愚蠢的事情。我原以为从学校出来之后,除了找工作有测试外,不会有任何与考试有关的事儿。 但是,天有不测风云,公司技术总监、人事总监两位大佬突然降临到我们事业线,叫上我老大,给我们组织了一场别开生面的“考试”。 那是一个风和日丽的下午,我翘着二郎腿,左手端着一杯卡布奇诺,右手抓着我的罗技鼠标,滚动着轮轴,穿梭在头条热点之间。 “淡黄的长裙~蓬松的头发...

大牛都会用的IDEA调试技巧!!!

导读 前天面试了一个985高校的实习生,问了他平时用什么开发工具,他想也没想的说IDEA,于是我抛砖引玉的问了一下IDEA的调试用过吧,你说说怎么设置断点...

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

立即提问
相关内容推荐